FizzBuzzムズイ

404 Blog Not Found:やる気ってどこでやる気?を読んでいたら,

いくらなんでも、FizzBuzz書けませんという子の面倒まで見る余裕はなかったしねえ、いくら「かけるようになります!」ってやる気があっても。

という文に目が止まった。FizzBuzzって何だ!?
リンク先のどうしてプログラマに・・・プログラムが書けないのか?を読むと,

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

ということらしい。まあ,そんなに難しそうではない。実際,

ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。

とのこと。
CかJavaなら2分で書けそうだなと考えつつ*1,しかし,これじゃ簡単すぎて書く気でないなと思っていたら,

FizzBuzzテストが簡単すぎるとは思わない方がいい(実際意図的にバカみたいに簡単にしてあるわけだが)。イムランのポストにコメントした人が、このテストの有効性について書いている。

   面接者がFizzBuzzテストを簡単すぎると思ってやらないことを残念に思う。私の経験で言えば、最も簡単なプログラミングタスクさえできない候補者の多さには、まったく驚くしかない。

とあったので,やってみることにした。
言語はHaskell。プログラムはこんな感じ。

fizzbuzz_ n xs = (putStrLn (fb n)):(fizzbuzz_ (n + 1) xs)
                where
                fb n | n `mod` 15 == 0 = "FizzBuzz"
                     | n `mod` 3 == 0 = "Fizz"
                     | n `mod` 5 == 0 = "Buzz"
                     | otherwise = show n

fizzbuzz n = sequence_ (take n (fizzbuzz_ 1 []))

fizzbuzz 100”とすれば望んだものを得られる。実装に30分かかったのは秘密中の秘密だ!。。。orz
すぐ後に気づいたが,“fb n”を次のようにするとmod演算が少なくて良いかも。

fb n = if null s then show n else s
       where
       s = (if n `mod` 3 == 0 then "Fizz" else "") ++ (if n `mod` 5 == 0 then "Buzz" else "")

見た目あまりスマートじゃないけど。

FizzBuzz,結構色々な言語で書かれてるみたい。
http://d.hatena.ne.jp/Notz/20080315ではPrologで書かかれてる。全然わからんぞ。
恐るべき現実(マイナー言語によるFizzBuzz問題解集) - 永字八法にいったってはNScripterだ!!というか結構色々な言語で書かれているのですね。お,Haskellもいる。

むう,見た目は似てるがこっちのほうが私のより良い感じだ。

*1:他の言語だとプリントのしかたがわからない