平凡エンジニアによる平凡ブログ

平凡インフラエンジニアがスキルアップを目指してプログラミングやクラウドやサーバといったインフラのアウトプットをしていきます!

【ruby】FizzBuzz問題について

FizzBuzzの問題とは「1から100まで数を数える時に、3の倍数なら「fizz」、5の倍数なら「buzz」、ただし15の倍数なら「fizzbuzz」、それ以外はその数を答える問題」のことでプログラミングの素質を問う問題とのこと

この問題を見たとき、残念ながら素質ない私は最初普通の以下のように書いてしまいました。

for i in 1..99 do
  if i%3 == 0
    puts "fizz"
  elsif i%5 == 0
    puts "buzz"
  elsif i%15 == 0    
    puts "fizzbuzz"
  else
    puts i
  end  
end

for文で1~100を繰り返す処理をつくり、if文で場合分けすればいいのではと思いました。その構文自体は書けているのですが、結果は次のようになりました。

1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizz
~以降省略

あれっ15の倍数でfizzbuzzが表示されていない!ということに気づきました。 それもそのはず、15の倍数は3の倍数でもあるし、5の倍数でもあります。 そのためこの書き方だと15の倍数は3の倍数で判断されてfizzの表示になっていたんですね。

なのでこの形式で書くなら15の倍数を先に持ってきて処理させないといけません。

for i in 1..99 do
  if i%15 == 0
    puts "fizzbuzz"
  elsif i%5 == 0
    puts "buzz"
  elsif i%3 == 0
    puts "fizz"
  else
    puts i
  end  
end
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizzbuzz
~以降省略

こんなことにも気づけないとは・・素質ないんだろうな 今まではサンプルのコードをアレンジしながらプログラミングしてたが 不格好でもいいので、自分で0からコードを書くようにしないといけないな と思いました。