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))
実は、ものすごく簡単に書けたりしちゃうんでしょうか?
書くのにものすごく時間がかかったのは秘密です。