LoginSignup
3
3

More than 3 years have passed since last update.

[Ruby] fizzbuzzの複数コード紹介

Last updated at Posted at 2019-05-24

概要

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にするとパターンマッチングがつかえるようになりました。

3
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3