繰り返し現れる部分文字列の発見
うん、まぁ、Suffix Array を使って「任意部分文字列の頻度計数」なんてことをやっていた自分にとっては、手元のコードを組み合わせて30行ほどのコードを書け足せば、それなりの速度で動くものが出来上がるという状態だったりするんだけど、いきなり回答を書いてしまうのもあれかと思うので、とりあえずさらすのはやめておく。繰り返し回数 k 回以上とか言う指定も可だったり。
なお Pentium M 2GHz で 30 MBytes ほどのテキストに対して処理時間 24 秒程度。理論上はテキストのサイズ n に対して線形時間で求められるんだけど、その手法だと逆に遅くなったりする罠。
Lisp で FizzBuzz
あえて Common Lisp の do マクロを避けて、自分で defmacro してみる。ちょっとしたリハビリ。つうかまだひっ ぱるのか。
Emacs Lisp で書いたけど、Common Lisp でもそのまま動くだろう。たぶん。
(defmacro from-to (var from to &rest body) `(let ((,var ,from)) (while (<= ,var ,to) (progn ,@body (setq ,var (1+ ,var)))))) (defun fizzbuzz () (from-to i 1 100 (let ((mul3p (zerop (mod i 3))) (mul5p (zerop (mod i 5)))) (cond ((and mul3p mul5p) (print "FizzBuzz")) (mul3p (print "Fizz")) (mul5p (print "Buzz")) (t (print i))))))