有名すぎるアルゴリズムのうちの一つ、fizbuzz問題の応用編を解きました。
一般的なfizbuzz問題
1から100まで数を数える時に、3の倍数なら「fizz」、5の倍数なら「buzz」、ただし15の倍数なら「fizzbuzz」、それ以外はその数を答えなさい。
普通に解くなら、
if文を使って条件分岐 + while文でループしながら1を足していく
というので解決すると思います
私の回答
num = 1 while num <= 100 do if num % 15 == 0 puts "fizzbuzz" elsif num % 5 == 0 puts "buzz" elsif num % 3 == 0 puts "fizz" else puts num end num += 1 end
注意することといえば、先に「3の倍数」「5の倍数」を持ってこないことぐらいかな
(if文の場合、最も当てはまりにくい条件を上に書く必要があるので)
今回私が出会った問題
1から100まで数を数える時に、3の倍数なら「fizz」、5の倍数なら「buzz」、ただし15の倍数なら「fizzbuzz」、それ以外はその数を答えなさい。ただし、elsifは利用しないこと。
!?!?
elsifを利用しないってことはif文使わずにcase~whenかな・・・
と一瞬思いましたが、もちろんそんなはずはない
(case文の場合、条件部分は必然的に全てが == になる)
if文の中にif文を入れ込んだり変なことを色々しましたが、
結局うまくいかず回答を見てしまいました。
模範回答
num = 1
while num <= 100 do 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
な、なるほど・・・!!
「何かを出力する」という挙動が共通しているため、puts str
出力する文字列はnumの値によって条件分岐する必要があるため、
もちろんif文は使うのですが
str = ""
空のstrを定義し
if num % 3 == 0
str = str + "fizz"
end
3の倍数の場合はfizzを足す
if num % 5 == 0
str = str + "buzz"
end
5の倍数の場合はbuzzを足す
if str == ""
str = str + num.to_s
end
numが3の倍数でもなく、5の倍数でもない、すなわち
strがまだ空の場合は、numを文字列に変換したものを足す
ここで15は・・・?というと、
3の倍数でもあり5の倍数でもあるので、
最初にstrにfizzが入り、次にbuzzが足されることにより
fizzbuzzになっている、という。。
概念的なところから試されていた。
めちゃくちゃ納得、というか惨敗でした。
-------------------------------------
私がこれまでの学習で読んだ本をこちらにまとめています。※随時更新
転職の時に使って良かったサイト・おすすめのサイトを紹介しています