ネットを巡回していたら、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はそんなことにならないように精進せねば。