С учетом нескольких векторов, как лучше создать новые векторы, которые перекрываются одним элементом?
Например, с учетом этих векторов:
[1 1 1] [2 2 2] [3 3 3]
Результирующие перекрывающиеся векторы будут:
[1 1 1 2] [1 2 2 2 3] [2 3 3 3]
Моя стратегия будет такой:
Код немного усложнен необходимостью обрабатывать начальные и конечные условия, но вы можете сделать это с помощью чего-то вроде:
(def vectors [[1 1 1] [2 2 2] [3 3 3]]) (map #(concat (if (last %1) [(last %1)] []) %2 (if (first %3) [(first %3)] [])) (cons nil (butlast vectors)) vectors (concat (rest vectors) [nil])) => ((1 1 1 2) (1 2 2 2 3) (2 3 3 3))
Рекурсивная реализация:
(defn overlap [colls] (loop [ret [] prefix [] x (first colls) colls (next colls)] (if colls (recur (conj ret (concat prefix x [(ffirst colls)])) [(last x)] (first colls) (next colls)) (conj ret (concat prefix x)))))