На днях я выполнил упражнение 43 на 4clojure и проверил некоторые другие решения. Один, в частности, смутил меня.
Задача просит вас написать функцию, которая удовлетворяет всем этим требованиям:
(= (__ [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)))
Мое решение было таким:
(fn [l n]
(map #(map second %) (vals (group-by #(mod (first %) n)
(map vector (iterate inc 0) l)))))
Пользователь сам имел следующее решение:
#(apply map list (partition %2 %1))
и я не мог понять, как это работает.
Давайте разберемся с первой проблемой:
(= (__ [1 2 3 4 5 6] 2) '((1 3 5) (2 4 6)))
ну, (#(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)