箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

elsifを使わずにfizbuzzを実現【Ruby】

f:id:y_hakoiri:20191102121618j:plain

有名すぎるアルゴリズムのうちの一つ、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になっている、という。。

 

 

概念的なところから試されていた。

めちゃくちゃ納得、というか惨敗でした。

 

 ------------------------------------- 

 

私がこれまでの学習で読んだ本をこちらにまとめています。※随時更新

www.y-hakopro.com

 

転職の時に使って良かったサイト・おすすめのサイトを紹介しています

www.y-hakopro.com