Just do IT

思うは招く

RubyでFizzBuzz問題を解く

プログラミングの初級問題として有名なFizzBuzz問題Rubyで書いてみた。

FizzBuzz問題とは

  • 3で割り切れる数字ならFizz
  • 5で割り切れる数字ならBuzz
  • 3と5で割り切れる数字ならFizzBuzz

を表示する問題のこと。 今はさすがに慣れたが、初心者の頃は「ふぁ!?なんじゃそら!そもそも問題の意味がむずかしい(数学が超苦手)」てな感じだった。

そして実際のコードはこちら。

def fizz_buzz(n)
  if n % 15 == 0
    'Fizz_buzz'
  elsif n % 3 == 0
    'Fizz'
  elsif n % 5 == 0
    'Buzz'
  else 
    n.to_s
  end
end

試しに実行してみる。 上記ファイルの、最後のendの下に以下を追記。

p fizz_buzz(1)
p fizz_buzz(3)
p fizz_buzz(5)
p fizz_buzz(15)

引数に数字を渡して、pコマンドでターミナルに表示する。 そしてこのコードを書いたファイルがあるディレクトリまで移動し、ターミナルで次を実行する。

ruby fizz_buzz.rb

ruby <ファイル名>でファイルが実行される。

するとこんな表示が出る。

"1"
"Fizz"
"Buzz"
"Fizz_buzz"

うん、大丈夫。

次に、いちいちfizz_buzz(1)とか書くのが面倒なので、一気に計算してみる。

(1..100).each do |n|
  if n % 15 == 0
    puts "FizzBuzz"
  elsif n % 5 == 0
    puts "Buzz"
  elsif n % 3 == 0
    puts "Fizz"
  else
    puts n
  end
end

すると、1から100までの数字をFizzBuzzでチェックする。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
〜〜〜

※100まで表示させるとブログが超縦長になってしまうので、15まで

解説

「3で割り切れる」というのは、「その数字を3で割った時に余りがゼロ」とも言いかえられる。したがって、次のように表現する。

n % 3 == 0

5も同じ。 「5で割ったときに余りがゼロ」を表現する。

n % 5 == 0

例えば、10を5で割ったときは余りがゼロになるので、Buzzと表示される。

初心者にとって少しむずかしいのが、「3と5で割れる数字」をどう表すか。 これは2通りある。

ひとつは、普通にこう書く。

n % 3 == 0 && n % 5 == 0

「3で割り切れて、かつ、5でも割り切れる数字」となる。こっちのほうが視覚的にはわかりやすい。

しかし、こう書くこともできる。

n % 15 == 0

「3と5で割り切れる」ということは、15でも割り切れる。

なお、

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

(1..100).eachは、「1から100」を繰り返すという意味。 自分はJSのfor文から入ったので、初めてこの書き方を見たときは驚いた。でも視覚的にわかりやすい。

最後に、どれにも当てはまらない数字は普通に数字として返して表示する。

  else
    puts n

注意点

自分が最初に少しハマった点。 最初はこう書いてしまった。

(1..100).each do |n|
  if n % 3 == 0
    puts "Fizz"
  elsif n % 5 == 0
    puts "Buzz"
  elsif n % 15 == 0
    puts "FizzBuzz"
  else
    puts n
  end
end

これだと、最後の「3で割り切れて、かつ、5でも割り切れる数字」が実行される前に、「n % 3」の部分で処理が実行されてしまう。 つまり、FizzBuzzは永遠に表示されない。

よって、最初に持ってくる。

(1..100).each do |n|
  if n % 15 == 0
    puts "FizzBuzz"
  elsif n % 5 == 0
    puts "Buzz"
  elsif n % 3 == 0
    puts "Fizz"
  else
    puts n
  end
end

できた!