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:他の言語だとプリントのしかたがわからない