Rubyから少し離れていたので復習がてらFizzbuzzプログラムを作りました。
Fizzbuzzプログラムとは?
Fizz Buzzとは、英語圏で行われている言葉遊びです。
プレイヤーが円状に座り、最初のプレイヤーは「1」と数字を発言し、次のプレイヤーは、直前のプレイヤーの次の数字を発言していきます。
ただし、発言する数字が3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、15で割り切れる場合は「Fizz Buzz」を数字の代わりに発言しなければなりません。
このFizzBuzzを、プログラムコードとして画面上に出力できるかどうかでプログラマーの技術力がわかるため、コーディング面接の題材としてよく使われています。
FizzBuzzプログラムは、以下のような挙動をするプログラムです。
- 3で割り切れる数値を引数に渡すと、「Fizz」を返す
- 5で割り切れる数値を引数に渡すと、「Buzz」を返す
- 3と5の両方で割り切れる数値を引数に渡すと、「FizzBuzz」を返す
- それ以外の数値は、その数値を文字列に変えて返す
要件
- fizz_buzzメソッドを定義し、1から30までの数を渡す
- 3で割り切れる数値をメソッドの引数に渡すと「Fizz」を返す
- 5で割り切れる数値をメソッドの引数に渡すと「Buzz」を返す
- 3と5の両方で割り切れる数値を引数に渡すと、「Fizz Buzz」を返す
- それ以外の数値は、その数値を文字列として返す
- fizz_buzzメソッドで返ってきた値をputsで表示する
fizz_buzzメソッドを定義
「3と5の両方で割り切れる数値」をnumber % 3 == 0 && number % 5 == 0という書き方でも表せますが、
もっとシンプルに考えて、3で割り切れる数値(=3の倍数)かつ、5で割り切れる数値(=5の倍数)は、
つまり15で割り切れる数値(=15の倍数)なので、number % 15 == 0と書くことができます。
またプログラムは、上から下に順番に処理されるため、15の倍数は、3でも5でも割り切れる数値なので、number % 15 == 0を条件分岐の先頭に持ってくる必要があります。
number % 3 == 0やnumber % 5 == 0を先に書いてしまうと、そちらが先にtrueで評価され、期待どおりの挙動をしなくなってしまいます。
def fizz_buzz(number)
# 15で割り切れる場合
if number % 15 == 0
'Fizz Buzz'
# 3で割り切れる場合
elsif number % 3 == 0
'Fizz'
# 5で割り切れる場合
elsif number % 5 == 0
'Buzz'
else
number.to_s
end
end
1から30までの数値をfizz_buzzメソッドに渡し、戻り値をputsで表示
# 1から30をfizz_buzzメソッドに渡し、putsで表示
range = 1..30
range.each do |x|
puts fizz_buzz(x)
end
完成コード
def fizz_buzz(number)
# 15で割り切れる場合
if number % 15 == 0
'Fizz Buzz'
# 3で割り切れる場合
elsif number % 3 == 0
'Fizz'
# 5で割り切れる場合
elsif number % 5 == 0
'Buzz'
else
number.to_s
end
end
# 1から30をfizz_buzzメソッドに渡し、putsで表示
range = 1..30
range.each do |x|
puts fizz_buzz(x)
end
実行結果
3の倍数の時は「Fizz」、5の倍数の時は「Buzz」、15の倍数(3の倍数かつ5の倍数)の時は「Fizz Buzz」と出力されました。