Как эта функция, которая инвертирует процесс чередования в х число подпоследовательностей - PullRequest
4 голосов
/ 24 января 2012

На днях я выполнил упражнение 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)

1 Ответ

8 голосов
/ 24 января 2012

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...