string - Clojure 中惯用的字符串旋转

标签 string clojure rotation burrows-wheeler-transform

如何在 Clojure 中以惯用方式为 Burrows-Wheeler transform 旋转字符串?

我想到了这个,它使用了 (cycle "string"),但感觉有点势在必行:

(let [s (str "^" "banana" "|")
      l (count s)
      c (cycle s)
      m (map #(take l (drop % c)) (range l))]
  (apply map str m))
=> ("^banana|" "banana|^" "anana|^b" "nana|^ba" "ana|^ban" "na|^bana" "a|^banan" "|^banana")

我不确定这是否符合代码高尔夫的条件。有没有更简洁的方法来做到这一点?

最佳答案

我会这样做:

(defn bwrot [s]
  (let [s (str "^" s "|")]
    (for [i (range (count s))]
      (str (subs s i) (subs s 0 i)))))

或:

(defn bwrot [s]
  (let [n (+ 2 (count s))
        s (str "^" s "|^" s "|")]
    (for [i (range n)]
      (subs s i (+ i n)))))

第二个应该分配更少(每次迭代一个字符串而不是三个)。

关于string - Clojure 中惯用的字符串旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721600/

相关文章:

python - 如何垂直显示列表?

jquery - 将鼠标悬停在按钮上时按精确变换度数旋转对象

"lookthrough"相机的 OpenGL(简单)场景和对象导航基础知识

javascript - 如何使用 javascript 将 JSON 对象的值转换为字符串

c# - 用于识别后跟数字的 Guid 的正则表达式

javascript - 使用 jQuery/Javascript 计算 textarea 中字符串的出现次数,而不是在新按钮按下时更新

http - 是否可以验证 GET 是来自按钮还是输入 URL 栏?

Haskell 的 foldr/l 和 Clojure 的 reduce

namespaces - 在 Clojure 中使用命名空间的常见约定有哪些?

internet-explorer - IE10 和旋转图像的抗锯齿功能