Ventana corredera sobre seq
Pregunta
En Clojure, ¿cuál sería la mejor manera de tener una ventana deslizante sobre un seq (finito, no demasiado grande)? ¿Debo usar drop
y take
y realizar un seguimiento del índice actual o hay una forma más agradable que me falta?
Solución
Creo que partición con el paso 1 lo hace:
user=> (partition 3 1 [3 1 4 1 5 9])
((3 1 4) (1 4 1) (4 1 5) (1 5 9))
Otros consejos
Si desea operar en las ventanas, también puede ser conveniente hacerlo con el 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)
No sabía que la partición
podía hacer esto, así que lo implementé de esta manera
(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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow