概要
fizzbuzz問題はいろんな解法があるな、と思ったので少しまとめ。
今回、3つのパターンを紹介しますが、結果はどれも同じになります。
パターン1
i = 1
while i <= 30
if i % 15 == 0
puts "FizzBuzz"
elsif i % 3 == 0
puts "Fizz"
elsif i % 5 == 0
puts "Buzz"
else
puts i
end
i += 1
end
素直につくったらこうなりますよね。
数字を配列にせず、1を変数に代入したあと、繰り返しのなかで自己代入演算子を用いてひとつずつ数字を増やしていくパターンです。
パターン2
num = 1
while num <= 30
str = ""
if num % 3 == 0
str = str + "fizz"
end
if num % 5 == 0
str = str + "buzz"
end
if str == ""
str = str + num.to_s
end
puts str
num += 1
end
こちらはelsifを使わないスタイルです。
空の変数を宣言し、各条件に応じてその変数に文字や数値を付け足しています。
パターン3
(1..30).each do |i|
number = ""
number = "fizz" if i % 3 == 0
number << "buzz" if i % 5 == 0
number = i unless i % 3 == 0 || i % 5 == 0
puts number
end
こちらは範囲になっているので、eachで繰り返しを行なっています。
それ以外はパターン2に似ていますが、文字列と数値をくっつけることを避けているため、to_sメソッドを使わずに済みました。
ただ、unlessはあまり使いたくないですね。
#まとめ
私ごとですが、はじめパターン1の方法でfizzbuzz問題を解き、その模範回答がパターン2だったので、それを改良した(つもり)パターン3をつくりました。
もっとおすすめのfizzbuzzコードがあれば教えていただきたいです。
#追加
コメントより教えていただいたパターンを追加します。
puts (1..30).map {|n|
case [n % 3, n % 5]
in [0, 0] then 'FizzBuzz'
in [0, _] then 'Fizz'
in [_, 0] then 'Buzz'
else n
end
}.join "\n"
ruby 2.7にするとパターンマッチングがつかえるようになりました。