Clojure中的惯用字符串旋转

Pet*_*ron 2 string clojure rotation burrows-wheeler-transform

如何在Clojure中为Burrows-Wheeler转换惯用旋转字符串?

我想出了这个,(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")
Run Code Online (Sandbox Code Playgroud)

我不确定这是否符合代码高尔夫的要求.有更清洁的方法吗?

cgr*_*and 5

我会做:

(defn bwrot [s]
  (let [s (str "^" s "|")]
    (for [i (range (count s))]
      (str (subs s i) (subs s 0 i)))))
Run Code Online (Sandbox Code Playgroud)

要么:

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

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