今更ながらFizz-Buzz問題

ちゃんとしたプログラマーでないのは分かっているが、以前から気になっていたFizz-Buzz問題というのを、遅ればせながらやってみた。

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

ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。

http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm/

すでにweb上には様々な言語で、思いもよらないアルゴリズムの回答も提出されている。さて、自分の場合は何で書くか...。最近のその進化に感激したOpenOfficeMacOSX版、NeoOfficの表計算*1でやってみる。

  • 最初に書いたのは以下。以下の数式を1行目から100行目までコピーすれば問題で要求された表示結果になる。(もしエクセルなら「;」を「,」に置き換えれば同じように使えると思う。)
=IF(MOD(ROW();15)=0;"FizzBuzz";IF(MOD(ROW();3)=0;"Fizz";IF(MOD(ROW();5)=0;"Buzz";ROW())))
  • ちょっと見難いので、改行を入れると以下のようになる。(ちなみに、改行を入れたコードでは数式が計算されない...。)
=IF(MOD(ROW();15)=0;"FizzBuzz";
   IF(MOD(ROW();3)=0;"Fizz";
     IF(MOD(ROW();5)=0;"Buzz";ROW())
   )
 )
  • しかし、15の剰余を利用するのは邪道な気がする。(本来プログラムが判定する事を、例題が簡単なのを良いことに、人間が頭の中で解決してしまっているので...。)面倒だけど、ちゃんとした条件判定にしてみる。
=IF(AND(MOD(ROW();3)=0;MOD(ROW();5)=0);"FizzBuzz";
   IF(MOD(ROW();3)=0;"Fizz";
     IF(MOD(ROW();5)=0;"Buzz";ROW())
   )
 )
  • FizzBuzz」の判定に、ANDや、15の剰余を利用してしまうのは、本当はあまり好きでない。そう考えているうちに、やっぱりRubyでやってみたくなった...。
(1..100).each do |i|
  s = ''
  s << 'Fizz' if i % 3 == 0
  s << 'Buzz' if i % 5 == 0
  s = i if s.empty?
  puts s
end

  • これなら、7の倍数のときは「Lucky」とプリントすること、という条件が追加されても修正は至って簡単。
(1..100).each do |i|
  s = ''
  s << 'Fizz' if i % 3 == 0
  s << 'Buzz' if i % 5 == 0
  s << 'Lucky' if i % 7 == 0
  s = i if s.empty?
  puts s
end


ちなみに、Rubyでちゃんと動くようになるまでには、2分以上かかっている。頭の中に処理手順はあるのだけど、ちょっとしたことで試行錯誤している...。以下、Rubyにエラーで怒られた経過。

  • 100に対してのeachメソッドになってしまい、NoMethodError: undefined method `each' for 100:Fixnum
1..100.each do |i|
  s = nil
  s << 'Fizz' if i % 3 == 0
  s << 'Buzz' if i % 5 == 0
  puts s || i
end
  • nilを代入してしまうと、「<<」メソッドが使えない。NoMethodError: undefined method `<<' for nil:NilClass
(1..100).each do |i|
  s = nil
  s << 'Fizz' if i % 3 == 0
  s << 'Buzz' if i % 5 == 0
  puts s || i
end


ちゃんとしたプログラマーではないが、表計算ソフトはちゃんと使えている、ということかな...。

*1:いつの間にか、仕事で使えるレベルになっていた!intelMac系になり、操作でもたつきを感じることもなくなった。高いライセンス料を払って、エクセル等をバージョンアップする必要性は、もはや、どこにもないと感じた...。