3

我正在寻找一个输入两个长度为 n 的向量的函数,

即 [:a :b :c :d :e :f] [1 2 3 4 5 6]。输出一个长度为 2n 的向量

[:a 1:b 2:c 3:d 4:e 5:f 6]。

但是,如果输入的第二个向量与 n 的长度不匹配,它将循环,

即 [:a :b :c :d :e :f] [1 2 3]

输出:[:a 1 :b 2 :c 3 :d 1 :e 2 :f 3]。

 (defn Swanson [x y] (vec (flatten (interleave x (repeat (count x) y)))))

此外,该函数还可以取[xy min max n],其中x和y是向量,min是开始交织的索引,max是结束交织的索引,n是交织的步长。

4

4 回答 4

6

你想要cycle

user> (take 6 (cycle [1 2 3]))
(1 2 3 1 2 3)

user> (interleave [:a :b :c :d :e :f] (cycle [1 2 3]))
(:a 1 :b 2 :c 3 :d 1 :e 2 :f 3)
于 2013-11-19T20:32:01.003 回答
1

您可以使用 seq 库中的 interleave 函数:

=> (interleave [:a :b :c :d :e :f] [1 2 3 4 5 6])
(:a 1 :b 2 :c 3 :d 4 :e 5 :f 6)

希望这可以帮助!

于 2013-11-19T19:56:00.947 回答
1

对于两个任意大小的向量:

(defn cycleave [a b] 
  (let [c (max (count a) (count b))] 
    (take (* 2 c) (interleave (cycle a) 
                              (cycle b)))))

会给:

user => (cycleave [:a :b :c :d :e :f] [1 2 3])
(:a 1 :b 2 :c 3 :d 1 :e 2 :f 3)
于 2013-11-19T20:37:09.463 回答
1

使用 x 和 y 向量, min (包括)起始索引, max (不包括)结束索引, n 步长:

(defn swanson [x y min max n]
  (->> (interleave x (cycle y))
       (take max)
       (drop min)
       (take-nth n)))
于 2013-11-29T03:56:50.550 回答