如何在 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/