【Ruby】FizzBuzzプログラムのチュートリアル|解答例を見ながら基本問題にチャレンジしよう

作成日: 更新日:

開発環境

  • Ruby version: ruby 3.1.2

RubyのFizzBuzzプログラムとは

FizzBuzzとは英語圏で長距離ドライブ中や飲み会の時に行われる数字を用いた言葉遊びです。 ジェフ・アトウッドがコードが書けないプログラマ志願者を見分ける手法としてFizzBuzz問題を提唱し、その提唱は世界的に様々な場所で議論の対象になっているほど有名です。 そのため、基本的なアルゴリズムを考え、プログラムを構築するチュートリアルとして幅広く使用されています。 Wikipedia:https://ja.wikipedia.org/wiki/Fizz_Buzz

RubyのFizzBuzzプログラムのチュートリアル

FizzBuzzプログラムにチャレンジするにあたり、FizzBuzzプログラムのルールを確認しましょう。 [st-mybox title="FizzBuzzプログラムのルール" fontawesome="fa-check-circle" color="#757575" bordercolor="#BDBDBD" bgcolor="#ffffff" borderwidth="2" borderradius="5" titleweight="bold"]

  • 1から100までの数字で下記の条件に合うプログラムを構築する
  • 3の倍数=>Fizzを表示する
  • 5の倍数=>Buzzを表示する
  • 3の倍数かつ5の倍数=>FizzBuzzを表示する
  • いずれにも当てはまらない場合は数字を表示する

[/st-mybox]

FizzBuzzプログラムのサンプルコード

1(1..100).each do |number|
2    if number % 3 == 0 && number % 5 == 0
3        puts "FizzBuzz"
4    elsif number % 3 == 0
5        puts "Fizz"
6    elsif number % 5 == 0
7        puts "Buzz"
8    else
9        puts number
10    end
11end

FizzBuzzプログラムの実行結果

11
22
3Fizz
44
5Buzz
6Fizz
77
88
9Fizz
10Buzz
1111
12Fizz
1313
1414
15FizzBuzz
1616
1717
18Fizz
1919
20Buzz
21Fizz
2222
2323
24Fizz
25Buzz
2626
27Fizz
2828
2929
30FizzBuzz
3131
3232
33Fizz
3434
35Buzz
36Fizz
3737
3838
39Fizz
40Buzz
4141
42Fizz
4343
4444
45FizzBuzz
4646
4747
48Fizz
4949
50Buzz
51Fizz
5252
5353
54Fizz
55Buzz
5656
57Fizz
5858
5959
60FizzBuzz
6161
6262
63Fizz
6464
65Buzz
66Fizz
6767
6868
69Fizz
70Buzz
7171
72Fizz
7373
7474
75FizzBuzz
7676
7777
78Fizz
7979
80Buzz
81Fizz
8282
8383
84Fizz
85Buzz
8686
87Fizz
8888
8989
90FizzBuzz
9191
9292
93Fizz
9494
95Buzz
96Fizz
9797
9898
99Fizz
100Buzz

RubyのFizzBuzzプログラムの注意点

FizzBuzzプログラムを構築するにあたり、いくつか注意点を解説していきます。

条件分岐の処理の順番で結果がかわる

FizzBuzzプログラムのルール通りにif文を構築した場合、下記になります。

1(1..100).each do |number|
2    if number % 3 == 0
3        puts "Fizz"
4    elsif number % 5 == 0
5        puts "Buzz"
6    elsif number % 3 == 0 && number % 5 == 0
7        puts "FizzBuzz"
8    else
9        puts number
10    end
11end

そして、実行結果を確認します。

11
22
3Fizz
44
5Buzz
6Fizz
77
88
9Fizz
10Buzz
1111
12Fizz
1313
1414
15+ Fizz
1616
1717
18Fizz
1919
20Buzz

実行結果の15行目は「3の倍数かつ5の倍数」にあたる15ですが、if文の条件分岐の順番をルール通りにしたことで「FizzBuzz」と表示されず「Fizz」と表示されています。 これは15が2行目の「if number % 3 == 0」で「true」となり、3行目の「puts "Fizz"」が実行されたため、6行目の「elsif number % 3 == 0 && number % 5 == 0」まで処理がいかなかったことが原因です。 そのため、どのように処理を行えば正常にプログラムを構築できるのか、基本的なアルゴリズムを考えることが大切です。

おわりに

RubyのFizzBuzzプログラムのチュートリアルを解説してきましたが、いかがだったでしょうか。 もし、私がFizzBuzzプログラムを書くとしたら下記のようにプログラムするでしょう。

1def FizzBuzz(number)
2    if number % 3 == 0 && number % 5 == 0
3        puts "FizzBuzz"
4    elsif number % 3 == 0
5        puts "Fizz"
6    elsif number % 5 == 0
7        puts "Buzz"
8    else
9        puts number
10    end
11end
12
13numbers = 1..100
14
15numbers.each do |number|
16    FizzBuzz(number)
17end

いわゆるオブジェクト指向を少し反映したプログラムですが、「define(ディファイン)」で処理をメソッド化し、メソッドを呼び出すことで戻り値を出力することで保守性と可読性を考慮しています。 そのほかにも、1行でプログラムを書くことを「one liner(ワンライナー)」といいますが、最短で1行でプログラムすることもできます。 FizzBuzzプログラムは、基本的なアルゴリズムを学ぶことができる基本問題なので、是非、チャレンジしてください。

【Ruby】FizzBuzzプログラムのチュートリアル|解答例を見ながら基本問題にチャレンジしよう | いっしー@Webエンジニア