Ruby FizzBuzz


IT未経験のスクール生が学んだことをアウトプットします

FizzBuzzは非常に有名なプログラミングの問題です。
私もRubyの勉強やり始めた時にこの問題と遭遇しました。
プログラミング初心者の方は特に覚えておきたい問題です。

FizzBuzz問題

1〜100までの数字をターミナルに出力してください。ただし、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzz、両方の倍数である「15の倍数」のときはFizzBuzzと出力してください。

1から100までの数字を出力させる

1〜100まで出力させるからといって以下のように順番にputsで出力しようとしては効率が悪すぎます。

良くない例

saple.rb
def fizz_buzz

puts 1
puts 2
puts 3
(中略)
puts 99
puts 100

一定の処理を繰り返す時にはwhile文を使います。

while文

while文は繰り返し処理を行う文法の1つです。

sample.rb
  while 条件式 do
    # 処理
  end

条件式を元に繰り返すかどうかを判定します。条件式がtrueの時は処理を繰り返します。
1~100まで出力、つまり数字が100以上になるまでは処理を繰り返すので、条件式は以下のようになります。

sample.rb
num = 1
while (num <=100) do
end

1から始まるのでnum=1を定義します。while文の中に書いてしまうとnumを判別できなくなりエラーが起こるので注意しましょう。

次にwhile文の中身である処理を記述しましょう。処理は問題文にある通り、「3の倍数」のときはFizzと、「5の倍数」のときはBuzz、両方の倍数である「15の倍数」のときはFizzBuzzと出力、です。

if文

「3の倍数の時は」や「5の倍数の時は」など条件によって処理が別れる時はif文を使います。
条件が複数の時はelsifを使います

書き方

sample.rb
  if 条件式1 
    # 条件式1が真(true)のときに実行する処理
  elsif 条件式2 
    # 条件式1が偽(false)のとき、かつ
    # 条件式2が真(true)のときに実行する処理
  elsif 条件式3
    # 条件式1が偽(false)のとき、更に
    # 条件式2が偽(false)のとき、かつ
    # 条件式3が真(true)のときに実行する処理
  else
    # 条件式1と条件式2がどちらとも偽(false)のときに実行する処理
  end

今回の問題に当てはめるとこうなります。

sample.rb
  def fizz_buzz
    num = 1
    while (num <= 100) do
      #15の倍数の時(もしnumを15で割った時の余りが0なら)
      if (num % 15) == 0
        puts "FizzBuzz"
      #3の倍数の時(numを3で割った時の余りが0なら)
      elsif (num % 3) == 0
        puts "Fizz"
      #5の倍数の時(numを5で割った時の余りが0なら)
      elsif (num % 5) == 0
        puts "Buzz"
      #それ以外の時
      else
        puts num
      end
    end
  end

最後に処理が終わるごとにnumを1ずつ増やさなければいけません。増やさないとnumが1のままで、
永遠に1だけが出力されます。

完成コード

sample.rb
 def fizz_buzz
    num = 1
    while (num <= 100) do
      if (num % 15) == 0
        puts "FizzBuzz"
      elsif (num % 3) == 0
        puts "Fizz"
      elsif (num % 5) == 0
        puts "Buzz"
      else
        puts num
      end
      # numを1ずつ増やす num +=1(自己代入演算子)でもOK
      num = num + 1
    end
  end
  #メソッドの実行
  fizz_buzz