プログラミングの初級問題として有名なFizzBuzz問題をRubyで書いてみた。
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
できた!