Deslizando janela sobre seq
Pergunta
Em Clojure, qual seria a melhor maneira de ter uma janela deslizante sobre um (finito, não muito grande) seq? Devo apenas usar drop
e take
e acompanhar o índice atual ou se existe uma maneira mais agradável que eu estou ausente?
Solução
Eu acho que partição com o passo 1 faz isso:
user=> (partition 3 1 [3 1 4 1 5 9])
((3 1 4) (1 4 1) (4 1 5) (1 5 9))
Outras dicas
Se você quiser operar nas janelas, ele também pode ser conveniente fazer isso com o mapa:
user=> (def a [3 1 4 1 5 9])
user=> (map (partial apply +) (partition 3 1 a))
(8 6 10 15)
user=> (map + a (next a) (nnext a))
(8 6 10 15)
Eu não sabia partition
poderia fazer isso para que eu implementado desta maneira
(defn sliding-window [seq length]
(loop [result ()
remaining seq]
(let [chunk (take length remaining)]
(if (< (count chunk) length)
(reverse result)
(recur (cons chunk result) (rest remaining))))))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow