概要
Rubyの勉強として FizzBuzz問題 を while と each を使用して解きました。解き方は他にもありますが、今回は個人的に使用頻度の低い while と、よく使用する each で問題を解いてみました。
(2020.1.13 追記) uptoメソッドと引数をつかった方法でも実践しました。
目次
-
実践
- 問題
- 解答(while)
- 解答(each)
- 解答(upto)
- おまけ
-
補足
-
まとめ
-
参考文献
実践
問題
1~100
の数字をターミナルに出力してください。
【条件】
- 値が3の倍数のとき、
"Fizz"
と出力 - 値が5の倍数のとき、
"Buzz"
と出力 - 値が3と5の倍数のとき、
"FizzBuzz"
と出力
解答(while)
def fizz_buzz
num = 0
while (num <= 100) do # 100まで繰り返す条件
num += 1 # 繰り返すたびに1を足していく
if (num % 15) == 0 # 15の倍数のとき
p 'FizzBuzz'
elsif (num % 3) == 0 # 3の倍数のとき
p 'Fizz'
elsif (num % 5) == 0 # 5の倍数のとき
p 'Buzz'
else # それ以外の時
p num
end
end
end
fizz_buzz
解答(each)
def fizz_buzz
(1..100).each do |num| # 1~100まで
if (num % 15) == 0 # 15の倍数のとき
p 'FizzBuzz'
elsif (num % 3) == 0 # 3の倍数のとき
p 'Fizz'
elsif (num % 5) == 0 # 5の倍数のとき
p 'Buzz'
else # それ以外のとき
p num
end
end
end
fizz_buzz
解答(upto)
def fizz_buzz
1.upto(100) do |num| # 1〜100まで
if num % 15 == 0
p 'FizzBuzz'
elsif num % 3 == 0
p 'Fizz'
elsif num % 5 == 0
p 'Buzz'
else
p num
end
end
end
fizz_buzz
おまけ
1〜100まで
ではなく 1〜任意の数まで
というパターンもできたらと思いプログラムを書きました。
方法はあまり変わらなくて 引数で指定した値まで繰り返し処理 をするというだけです。
def fizz_buzz(max_num)
1.upto(max_num) do |num| # 1〜引数で指定した数(任意の数)まで
if num % 15 == 0
p 'FizzBuzz'
elsif num % 3 == 0
p 'Fizz'
elsif num % 5 == 0
p 'Buzz'
else
p num
end
end
end
p 'いくつまで数えますか?'
num = gets.to_i
fizz_buzz(num)
補足
値が3と5の倍数のとき、
"FizzBuzz"
と出力
num % 3 == 0 && num % 5 == 0
解答では (num % 15) == 0
このように書いていますが、上記のように置き換えることができます。
3の倍数 or 5の倍数( 15の倍数 ) という条件を先に書く理由
問題文にもあるとおり、 「3と5の倍数」のとき、FizzBuzz なので 3の倍数でもあり5の倍数( 15の倍数 ) でなくてはいけません。この条件を最後に書いてしまうと、その前に 「3の倍数」 と 「5の倍数」 の条件が評価されてしまうのではじめに 15の倍数 を追加しています。
まとめ
- FizzBuzz問題の解き方は他にもあり上記で上げた以外でも解くことができる
- 今回のような条件があるときには 15の倍数 をはじめに追加しないと評価されない