今日も学んだことを忘れない為にメモします。
FizzBuzz問題とは
英語圏の有名な言葉遊びである “Fizz Buzz” (フィズバズ)のルールをコンピュータプログラムに実装したもの。
ルールは、1から順に数を数え上げていき、3の倍数なら「Fizz」、5の倍数なら「Buzz」、両方の倍数(15の倍数)なら「Fizz Buzz」、いずれでもなければその数を言う。
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
与えられている仕様を整理すると以下のようになる。
・数字の1~100を出力する
・値が3の倍数のときだけ、"Fizz"という出力に置き換える
・値が5の倍数のときだけ、"Buzz"という出力に置き換える
・値が3と5の倍数のときだけ、"FizzBuzz"という出力に置き換える
記述内容
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 = num + 1
end
end
fizz_buzz
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
まずは、1〜100までの数字をターミナルに出力するためのプログラムを書く。
条件を指定して繰り返し処理をしたいので、whileメソッドを使う。
whileメソッドは条件式が真(true)の間は繰り返し実行される。
def fizz_buzz
num = 1
while num <= 100 do
puts num
num = num + 1
end
end
次に"Fizz"、"Buzz"、"FizzBuzz"を出力する条件式を書く。
def fizz_buzz
num = 1
while (num <= 100) do
if num % 15 == 0 # 15の倍数のとき
puts "FizzBuzz"
elsif (num % 3) == 0 # 3の倍数のとき
puts "Fizz"
elsif (num % 5) == 0 # 5の倍数のとき
puts "Buzz"
else # それ以外のとき
puts num
end
num = num + 1
end
end
「3の倍数であるか」「5の倍数であるか」という条件式が先にあると「15の倍数であるか」が適用されなくなってしまい"Fizz"か"Buzz"が出力されてしまうので先に「15の倍数であるか」の条件式を書く。
「〇〇の倍数」を導き出す時は剰余演算子(%)を用いる。
以上になります。
最初はeach分で書いてみたのですが
def fizz_buzz
(1..100).each do |n|
if n % 15 == 0
print "FizzBuzz"
elsif n % 3 == 0
puts "Fizz"
elsif n % 5 == 0
puts "Buzz"
else
puts n
end
end
end
fizz_buzz
結果としてはルール通り数字と"Fizz"、"Buzz"、"FizzBuzz"は出力できたのですがなぜか"FizzBuzz"の隣に次の数字が出てきました。
FizzBuzz16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz31
どなたか理由がわかる方、ご教授ください。