FizzBuzz問題
2007/05/09
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
lispの練習のために、common lisp(clisp)でやってみた。
(defun fizz-buzz (num) (labels ((convert (n) (if (zerop (mod n 15)) "FizzBuzz" (if (zerop (mod n 5)) "Buzz" (if (zerop (mod n 3)) "Fizz" n)))) (rec (n lst) (if (zerop n) lst (rec (- n 1) (cons (convert n) lst))))) (rec num nil)))
追記20070509:zerop関数を知った。0と=で比較するよりカッコイイので修正
以下、上の関数の結果を表示する処理。
(defun print-list (lst) (if (null lst) nil (progn (format t "~D~%" (car lst)) (print-list (cdr lst))))) (print-list (fizz-buzz 100))
実は、ものすごく簡単に書けたりしちゃうんでしょうか?
書くのにものすごく時間がかかったのは秘密です。