Fizz-Buzz問題の問題

なにやら有名らしいので、何となく読んだコレの話
どうしてプログラマに・・・プログラムが書けないのか?
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
 基本的に、そういう問題を素早く解く能力なんて求められてないじゃないのかと。それは唯のエゴだよとか偉そうに書いてみる。しかし、日本人はもっと酷い事に、そうか!とか思って試験問題的に出したり、受ける方は対策で「Fizz-Buzz」を覚えたり(そう、考えるんじゃなくて)するから恐ろしい。悲劇だなコレは。これはむしろ何を見ても良いから時間内にそれを何とか仕上げるとか、0からでもそこまで持っていく能力の方が問われてるはずだから。全部覚えてたら意味ねー。問題は初めて解く問題じゃないと意味無いんじゃないのかと。でもまあgdgd書きながら自分も試してみることにした。
自分が思う最速の回答は

  1. ネットで見てパクッタ答え。相当速いYO!*1
  2. なんだったら手で全部書くとか。多分3分も在れば終わるし。

で、それじゃあんまりだからxyzzyでやってみた。

(let ((result nil))
  (dotimes (i 100 result)
	(cond
	 ((= i 0))
	 ((= (denominator (/ i 3)) 1)
	  (setq result (concat result (format nil "Fizz\n"))))
	 ((= (denominator (/ i 5)) 1)
	  (setq result (concat result(format nil "Buzz\n"))))
	 (t
	  (setq result (concat result(format nil "~A\n" i)))))
	  ))

こうかななんか違う感じ。割り算の余りがどうやって求めるのかの時点で既に分からずに、何か無理やりっぽいので誤魔化す。

(zerop (mod i 3))

こうすればよかったのかもしれないとか。dotimesじゃなくてwhileとかでやっても良いんだけど。というか、こういうのは再帰するんだろうか普通。

(defun fizzbuzz(i)
  (interactive)
  (cond
	 ((= i 0))
	 ((= (denominator (/ i 3)) 1)
	  (insert (format nil "Fizz")))
	 ((= (denominator (/ i 5)) 1)
	  (insert (format nil "Buzz")))
	 (t
	  (insert (format nil "~A" i))))
  (if (< i 100)
	(fizzbuzz (1+ i)))
  )

再帰っぽいやり方が普通なのかなよく分からない。そもそも再帰する何かって殆ど試したことすらない感じだというのに気づいた。細かい部分は面倒なのでinsertとかいうあからさまに手抜きで誤魔化すとか。
答え合わせにグぐって見たけど、xyzzyじゃないらしいので、Emacsで調べたら
Emacs LispFizzBuzz - あどけない話
http://d.hatena.ne.jp/kazu-yamamoto/20080123/1201054339
コレとか見つけた。mapってこういう風に使うのかとか。マクロ使ったりしてなにやらカコイイ。というか、まず結果がリストで出る辺で既に色々違う感じ。

再帰の方が良いのかとゴニョゴニョやってたら普通に20分くらいかかってたと言うか、fizzbuzzって普通に難しいじゃん。というか、能力のもんだ(ry

*1:後で答え合わせしたら、30秒で見つかった。