【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プログラムは、基本的なアルゴリズムを学ぶことができる基本問題なので、是非、チャレンジしてください。