«前の日記(2007-05-08 (火)) 最新 次の日記(2007-05-15 (火))»  

まちゅダイアリー


2007-05-09 (水)

Fizz-Buzz問題

どうしてプログラマに・・・プログラムが書けないのか?より。

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

ちゃんとしたプログラマかどうか怪しいのでやってみた。

#!/usr/bin/env ruby
a = 3
b = 5
for i in 1..100
  if (i % a == 0 && i % b == 0)
    puts 'FizzBuzz'
  elsif (i % a == 0)
    puts 'Fizz'
  elsif (i % b == 0)
    puts 'Buzz'
  else
    puts i
  end
end

最初は case を使おうとして Ruby のマニュアルを調べたり、

for i in 1..100

の代わりに

100.times do |i|

と書いたり(これだと i は 0 から 99 までになる)と回り道して所要時間は5分ほど。 2分じゃ書けなかったので失格か。 それに、同じような条件式が2回ずつ出てくるところもイケてない気がする。

ちなみに、最初に15で割り切れたら FizzBuzzという解はなるほどーという感じだけど、「3と5の両方の倍数」という元の問題が見えにくくなるので個人的にはあまり好きじゃない。 それよりも

(i % a == 0)

(i % b == 0)

を一つにまとめて、Unknown::Programming - Fizz-Buzz問題で書かれているような解に持って行く方が好みかな。

for my $i (1..100) {
    my $str;
    $str  = 'Fizz' if $i % 3 == 0;
    $str .= 'Buzz' if $i % 5 == 0;
    say $str || $i;
}

追記

www.textfile.org - どうしてプログラマに・・・プログラムが書けないのか?に鋭い指摘。

ちゃんとしたプログラマであれば、この要求が曖昧であることを指摘するだろう。「3と5両方の倍数」は「3の倍数」でもある。としたら、3の倍数のときには「FizzとFizzBuzzの両方」を出すべきか?それともFizzを出すのは「3の倍数であって5の倍数でないとき」なのか?

なるほど。

if A {
   ...
} else if B {
   ...
} else if C {
   ...
}

なのか、

if A {
   ...
}
if B {
   ...
}
if C {
   ...
}

ということか。

if A ... or if B ... or if C ...

if A ... and if B ... and if C ...

の違いかも。

Tags: Ruby