遅延シーケンスでFizzBuzz
(defn cycle-pattern [n s] (lazy-cat (take (dec n) (repeat "")) [s])) (def fizz-seq (cycle (cycle-pattern 3 "fizz"))) (def buzz-seq (cycle (cycle-pattern 5 "buzz"))) (def fizzbuzz-seq (->> (map str fizz-seq buzz-seq) (map #(if (empty? %2) %1 %2) (iterate inc 1))))
(doall (take 100 fizzbuzz-seq)) ;=> (1 2 "fizz" 4 "buzz" "fizz" 7 8 "fizz" "buzz" 11 "fizz" 13 14 "fizzbuzz" 16 17 "fizz" 19 "buzz" ...) (nth fizzbuzz-seq 100004) ;=> "fizzbuzz"
メモ化も働きます。
ところで
cycle-pattern をもっと簡単に書けないだろうか? pythonなら
from itertools import cycle fizz_seq = cycle([""]*2 + ["fuzz"]) buzz_seq = cycle([""]*4 + ["buzz"])
これでできてしまうのだが。