这个函数如何将交错过程反转为x个子序列

Rav*_*avi 4 clojure

我前几天在4clojure 完成了练习43,并检查了其他一些解决方案.一个人特别困惑我.

挑战要求您编写一个满足所有这些要求的函数:

(= (__ [1 2 3 4 5 6] 2) '((1 3 5) (2 4 6)))
(= (__ (range 9) 3) '((0 3 6) (1 4 7) (2 5 8)))
(= (__ (range 10) 5) '((0 5) (1 6) (2 7) (3 8) (4 9)))
Run Code Online (Sandbox Code Playgroud)

我的解决方案是:

(fn [l n] 
    (map #(map second %) (vals (group-by #(mod (first %) n) 
    (map vector (iterate inc 0) l)))))
Run Code Online (Sandbox Code Playgroud)

用户自己有这个解决方案: #(apply map list (partition %2 %1)) 我无法弄清楚它是如何工作的.

让我们解决第一个问题:

(= (__ [1 2 3 4 5 6] 2) '((1 3 5) (2 4 6)))
Run Code Online (Sandbox Code Playgroud)

(#(partition %2 %1) [1 2 3 4 5 6] 2)将给我们((1 2) (3 4) (5 6))现在怎么做apply map list就产生(1 3 5) (2 4 6)

mik*_*era 8

apply使用的是((1 2) (3 4) (5 6))作为附加参数的可变长度列表.然后迭代地图将list函数应用于所有这三个附加列表.

结果它扩展如下:

   (apply map list '((1 2) (3 4) (5 6)))
=> (map list '(1 2) '(3 4) '(5 6))
=> (list 1 3 5) and (list 2 4 6)
Run Code Online (Sandbox Code Playgroud)