создание перекрывающихся векторов в clojure - PullRequest
1 голос
/ 19 июня 2011

С учетом нескольких векторов, как лучше создать новые векторы, которые перекрываются одним элементом?

Например, с учетом этих векторов:

[1 1 1] [2 2 2] [3 3 3]

Результирующие перекрывающиеся векторы будут:

[1 1 1 2]
      [1 2 2 2 3]
              [2 3 3 3]

Ответы [ 2 ]

2 голосов
/ 19 июня 2011

Моя стратегия будет такой:

  • Создание трех последовательностей векторов, каждая смещение на одну (вперед и назад)
  • Отображение этих трех последовательностей, объединение последних и первых элементовпредыдущего и последующего вектора со всем текущим вектором

Код немного усложнен необходимостью обрабатывать начальные и конечные условия, но вы можете сделать это с помощью чего-то вроде:

  (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))
1 голос
/ 20 июня 2011

Рекурсивная реализация:

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