初学者によるプログラミングMemo #11 fizz,buzz問題


はじめに

今回はfizzbuzz問題についてすこしお話しします
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

目次

  • fizzbuzz問題
  • 注意点

fizzbuzz問題

fizzbuzz問題とは「1から100まで数を数える時に、3の倍数なら「fizz」、5の倍数なら「buzz」、そして15の倍数なら「fizzbuzz」、それ以外はその数を答える」というものです
なんか世界のナ○アツが似たようなことしていましたね
数え方としては「1,2,fizz,4,buzz...」と言った形ですね

これはプログラミング界隈で試験的な扱いになっているようです
色々と背景があるようですね
答えは一つではなく、色々な書き方があります

while文 その1

num = 1
while num <= 100

  if num%15 == 0
    puts "fizzbuzz!"
  elsif num%3 == 0
    puts "fizz!"
  elsif num%5 == 0
    puts "buzz!"
  else
    puts num
  end

  num += 1

end

これはnumが100以下の時にずっと繰り返す式です
まず15かどうかのフィルターにかけて、次に3かどうか、そして5かどうかを判断し、どれにも該当しなければelseを返します
%は割り算をして、あまりがあるかどうかを調べています
あまりがない場合、あまりは"0"、つまり"== 0"が成り立ちます

while文 その2

num = 1
while num < 101
  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を使わないパターンです
今回は、"str"という変数を用いています
まず、前回同様割り算にてあまりがあるかどうかで判定します
この文の欠点は、"fizzbuzz!"にできず"fizzbuzz"か"fizz!buzz!"になる点です
コメント欄にそうならない方法を書いていただきました、ありがとうございます

### for文

for num in 1..100

  if num%15 == 0
    puts "fizzbuzz!"
  elsif num%3 == 0
    puts "fizz!"
  elsif num%5 == 0
    puts "buzz!"
  else
    puts num
  end

end

1行目でnumに1~100を順番に代入していきます
あとは一緒です

each文

(1..100).each do |num|

  if num%15 == 0
    puts "fizzbuzz!"
  elsif num%3 == 0
    puts "fizz!"
  elsif num%5 == 0
    puts "buzz!"
  else
    puts num
  end

end

each文で1~100を順番に並べます
あとは一緒です

times文 upto文

#1..100.times do |num| ←こちらは間違いです0〜99までの結果しか出ませんので修正します
1.upto(100) do |num|

  if num%15 == 0
    puts "fizzbuzz!"
  elsif num%3 == 0
    puts "fizz!"
  elsif num%5 == 0
    puts "buzz!"
  else
    puts num
  end

end

times文で1~100までを繰り返します
upto文で1~100までを繰り返します
あとは一緒です

注意点

3と5の判定順は入れ替えても問題ない(互いに素数のため)ですが、15の判定位置は記述位置でないといけません
先に約数である3,5の判定がなされた場合、そちらが優先されるからです
そういう点ではwhile文のその2は優位に立っていると言えます