みなさんは、”FizzBuzz“問題挑戦したことがありますでしょうか?
プログラミングの学習をしているかたなら一度は聞いたことがあるかと思います。
今回は、FizzBuzz問題について解説していきたいと思います。
プログラミングの学習に慣れてきた方は、ぜひ挑戦してみましょう。
目次
FizzBuzz問題とは
そもそのどのような問題なのか、知らない方もいるかと思いますので内容を見ていきましょう。
FizzBuzz問題
- 1から100まで数える
- 3で割り切れる数値であれば、”Fizz”を返す。
- 5で割り切れる数値であれば、”Buzz”を返す。
- 15で割り切れる数値であれば、”FizzBuzz”を返す。
- それ以外の数値はそのまま数値を返す。
上記が問題の内容になります。
いかがでしょうか?
「上記の条件を満たす、コードを記述してください!」と言われて、コードが書けるでしょうか?
正直、問題としての難易度は高くありません。
ある程度プログラミングできる人なら普通に解けるでしょう。
だからこそ、解けるか解けないでプログラミングの基礎が分かっているかを、ある程度判断することができます。
このブログでは、全くコードが思いつかなかった人でも理解できるように解説していきますので、頑張っていきましょう!
レッスン1 ~1から100まで数える処理を書こう~
まずは、1から100までの数字を数える必要があります。
rubyファイルを用意して、コードを書いていきましょう。
任意のディレクトリに、fizz_buzz.rbのファイルを用意しましょう。
準備ができたら、記述していきます。
fizz_buzz.rbnum = 0
while num < 100 do # while文を使い、条件を満たすまで繰り返し処理を行う
num += 1
puts num
end
記述することができたら、実行して確認してみましょう。
# ターミナルで実行(fizz_buzz.rbが格納されているディレクトリに移動してから実行) ruby fizz_buzz.rb
ターミナルに1から100まで表示されたでしょうか?
うまく実行できない場合は、コードの記述に問題がないか確認してみましょう。
今回行ったことは、以下の内容です。
- 数えたい数を変数(num)として定義する
- while文を使って、変数の中身が100になるまで繰り返し処理を行う
確認することができたら、次に進みましょう。
レッスン2 ~3・5・15で割り切れた場合を考える~
レッスン2では、数えた数字が「3で割り切れた場合」「5で割り切れた場合」「15で割り切れた場合」の処理を考えていきます。
問題の内容を思い出してみましょう。
- 3で割り切れる数値であれば、”Fizz”を返す。
- 5で割り切れる数値であれば、”Buzz”を返す。
- 15で割り切れる数値であれば、”FizzBuzz”を返す。
上記のように割り切れる数値によって処理を分ける必要がありましたね。
では、早速コードを考えていきましょう。
fizz_buzz.rbnum = 0
while num < 100 do
num += 1
if num % 15 == 0 # ①
puts "FizzBuzz"
elsif num % 3 == 0 # ②
puts "Fizz"
elsif num % 5 == 0 # ③
puts "Buzz"
else
puts num
end
end
コードを記述することができたら、ターミナルで実行していきましょう。
# ターミナル
ruby fizz_buzz.rb
以下の動画のように表示されていればOKです!
問題なく表示されていたでしょうか?
では、記述したコードの内容を解説していきます。
①では、数えた数値(num)が、15で割り切れるか確認しています。
15で割り切れる数の確認方法ですが、「numを15で割った余りが0と等しければ」という条件式で確認することが可能です。
%で、余り計算を行うことが可能です。
割り切れる=余りがでない
②では、①の条件式に当てはまらなかった場合に、数値が3で割り切れるか確認しています。
①と同じく3で割ったときの余りが0と等しいかで確認することが可能です。
③では、①、②どちらの条件式にも当てはまらなかった場合、数値が5で割り切れるか確認しています。
確認方法は、上記と同じです。
②の条件式と③の条件式はどちらを先に記述しても問題はありません。
しかし、①の条件式は最初に記述する必要があります。
なぜ最初に記述する必要があるのか考えてみましょう。
例えば、fizz_buzz.rbを以下のように記述したとします。
num = 0
while num < 100 do
num += 1
if num % 3 == 0 # 先に3で割り切れるか確認
puts "Fizz"
elsif num % 15 == 0
puts "FizzBuzz"
elsif num % 5 == 0
puts "Buzz"
else
puts num
end
end
ターミナルで実行して処理の結果を確認してみましょう。
# ターミナル実行結果(3で割り切れることを最初に確認した場合)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz ← 注目
16
.
.
省略
15のところが”FizzBuzz”ではなく、”Fizz“と表示されていますね。
15で割り切れる場合の処理を記述しているのに、なぜ”Fizz”が表示されてしまうのでしょか?
理由は、コードが上から読まれていくからです。
そのため、15に対して、最初に確認する条件式は、3で割り切れるか
になります。
15は3で割り切れてしまうため、”Fizz”を表示させる処理が実行されてしまい、
15で割り切れるか確認する条件式までたどり着かない
ということになります。
条件式の順番には、気をつけるようにしましょう。
以上で、FizzBuzz問題終了です!
いかがだったでしょうか?
コードを見てみるとそこまで難易度が高くないことがわかるかと思います。
今回は、繰り返し処理にwhile文、条件分岐にif文を使用しましたが、以下のように別の記述でも実装することが可能です。
記述例)
1.upto(100) do |num|
case
when num % 15 == 0
puts "FizzBuzz"
when num % 3 == 0
puts "Fizz"
when num % 5 == 0
puts "Buzz"
else
puts num
end
num += 1
end
自分なりのコードを記述してみるのも良いかと思います。
その際、こちらの記事を見て、考え方の参考にしていただけると幸いです。
最後までご覧頂きありがとうございました!