ネットを巡回していたら、Fizz-Buzz問題ってのがあったのでやってみた。
言語は当然自分の中で盛り上がっているRubyで。ちなみに問題文は以下ね。
1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに 'Fizz' と、
5の倍数のときは 'Buzz' とプリントし、3と5両方の倍数の
場合には 'FizzBuzz' とプリントすること
どうしてプログラマに・・・プログラムが書けないのか?
2分でやれれば、まぁ、それなりってことでスタート。
100.times do |n| nn = n + 1 str = "" str << "Fizz" if (nn % 3) == 0 str << "Buzz" if (nn % 5) == 0 if str == "" then p nn else p str end end
えーと、5分くらいかかったorz
irbで初めやろうとして100.eachとか意味不明な記述をしたりthenを忘れたり散々だった。でもまぁ、ロジック自体はすぐに思いついたからいいだろう*1。そんなに長いコードにもならなかったし・・・。ワンライナーな方々を除けば大体こんな書き方になると思います。
でも、さすがに・・・nn = n + 1ってカッコ悪すぎだろ・・・というわけで、この部分を消せる他の書き方がないか調べてみたら、いくつか見つかった。
まず、1.upto(100)っていう書き方。
1.upto(100) do |n| str = "" str << "Fizz" if (n % 3) == 0 str << "Buzz" if (n % 5) == 0 if str == "" then p n else p str end end
もう一つは、(1..100)を使う書き方。
(1..100).each do |n| # 中身は上と同じ end
やっぱり簡単な問題でも、実際に書いて調べる必要あるね*2。
で、ここまで書いておいて、そういえば、昔ブログに書いたような記憶があるな・・・と思って検索してみたら実は2年前にやっていたw
Fizz-Buzz問題とやらをやってみる - hellkite 日記と雑記とメモ。
言語はPythonだったけど。そうか、2年前はPythonだったか。setとか全然忘れているんですけど。うーん、使わないとやっぱり忘却の彼方、ですね。Rubyはそんなことにならないように精進せねば。