プログラマ職に応募してくる人間のほとんどが書けない「Fizz-Buzz問題」:濃縮還元オレンジニュース|gihyo.jp … 技術評論社
あぶないあぶない。ちょっといまさら感のある話題だけど、FizzBuzz問題みたいなのって「出来るにきまってる」って思うから書かないで終わりがちですな。
FizzBuzz問題
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と,5の倍数のときは「Buzz」とプリントし,3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
「こんな簡単な問題、俺が何年プログラマやってると思うんだ!?」なんて言わずに書いとこうか。
(1..100).each do |i| if(i % 15 == 0) puts 'FizzBuzz' elsif(i % 5 == 0) puts 'Buzz' elsif(i % 3 == 0) puts 'Fizz' else puts i end end
初めは
100.times do |i| i+=1 if(i % 5 == 0 && i % 3 == 0) puts 'fizzbuzz' elsif(i % 5 == 0) puts 'buzz' elsif(i % 3 == 0) puts 'fizz' else puts i end end
なんて風にiをインクリメントしたり、「3と5両方の倍数」を律儀に3と5での剰余出してたのはナイショ。しかも何気に文字の大小を間違えてる。あと、数回コンパイル通らなかった。恥ずかしいわー。とはいえ、調べた限りじゃとても一般的な解を書いてるみたいかな。
個人的にはこれが気に入りました。FizzとBuzzをくっつけていくという発想はなかった。
(1..100).each{|i| x = '' x += 'Fizz' if i%3==0 x += 'Buzz' if i%5==0 puts(x.empty? ? i : x); }
Ruby Quiz - FizzBuzz (#126)より
ワンライナーですごいのもあるけど、このあたりが落としどころじゃないですかね?