みやちゃ
皆さんこんにちは、みやちゃです!
物理とプログラミングについて解説しています!
皆さんはFizzBuzz問題というのをご存知でしょうか?
プログラマの中ではかなり有名な問題で、様々なプログラミング言語で解かれています。
「これができないとプログラマとして失格」と言われることがあるそうです。
今回はこのFizzBuzz問題をRubyで書いていきます。
- FizzBuzz問題とは
- FizzBuzzプログラムの作成
- FizzBuzzプログラムでよくある間違い
FizzBuzzプログラムを作成できる
以下のような流れで進めていきます!
- FizzBuzz問題とは
- FizzBuzzプログラム作成
- よくある間違い
目次
FizzBuzz問題とは
FizzBuzz問題は、プログラマの間で有名な問題で、様々なプログラミング言語で解くことができます。
「これができないとプログラマとして失格」とも言われたりするそうなので、ぜひできるようにしたい問題です。
今回はRubyでコードを書いていきます。
Rubyの言語がよくわからないという方にも詳細に理解できるように、記事を書いているので安心してください。
それでは実際に作成していきましょう!
FizzBuzzプログラム作成
FizzBuzzプログラムの概要
FizzBuzzプログラムの概要は以下のようになります。
- 1〜30までの数字を表示する
- 3で割り切れる数値のときは、"Fizz"と返す
- 5で割り切れる数値のときは、"Buzz"と返す
- 15で割り切れる数値のときは、"FizzBuzz"と返す
- それ以外の数値は、その数値を文字列で返す
ファイルを作成
ここから実際にプログラムを書いていきます。
まずはコードを書くファイルを作成します。
Sublime Textを開き、新しいファイルを作成します。
[File] → [New File]で新しいファイルを作成することができます。
次にファイルを保存します。
command + s でファイルを保存できます。
ファイル名を「fizzbuzz.rb」で、場所は「Desktop」で保存します。
作成したファイルにコードを書いていきましょう。
FizzBuzzプログラム作成
1〜30までの数字を表示
まずは、1〜30までの数字を繰り返し処理によって表示させます。
(1..30).each do |i|
puts i
end
eachメソッドは、繰り返し処理を行うメソッドです。
変数を「i」として、「puts i」で変数「i」に格納された1〜30までの数字を繰り返し返します。
一度試しに実行してみます。
Terminalを開き、「ruby fizzbuzz.rb」と入力します。
結果は、
mbp:Desktop miyacha$ ruby fizzbuzz.rb
1
2
3
...
28
29
30
mbp:Desktop miyacha$
ちゃんと1〜30までの数字を返してくれました。
「割り切れる」の表現方法
次に、「3、5、15の数値で割り切れる」という表現方法を見ていきます。
「%」は割り算の余りを求める演算子です。
「割り切れる」は、「%」を用いて表現します。
この「%」という演算子がどのように機能するのか、わかりやすいようにirbを起動して確かめてみましょう。
mbp:Desktop miyacha$ irb
irb(main):001:0> 5 % 3
=> 2
irb(main):002:0>
上では、Terminalでirbを起動し、「5 % 3」と入力しています。
その結果、「2」と返ってきているのがわかります。
「5÷3=1あまり2」の2の部分が返ってきていることがわかります。
みやちゃ
「%」という演算子を使って
「もし3で割り切れたら、Fizzという文字列を返す」
を書いてみましょう。
fizzbuzz.rbのファイルに以下のようにコードを追加します。
(1..30).each do |i|
if i%3==0
puts "Fizz"
else
puts i
end
end
「i%3==0」は、「iの数値を3で割った時の余りが0」という意味です。
次にターミナルで実行して見ましょう。
以下のような結果が返ってきました。
mbp:Desktop miyacha$ ruby fizzbuzz.rb
1
2
Fizz
4
...
Fizz
28
29
Fizz
mbp:Desktop miyacha$
うまく3の倍数の時に、「Fizz」という文字列が返ってきていることがわかります。
FizzBuzzプログラム完成
3と同様にして、「5で割り切れる」と「15で割り切れる」もコードを書いていきます。
fizzbuzz.rbのファイルを開き、以下のように、コードを書き換えてください。
(1..30).each do |i|
if i%15==0
puts "FizzBuzz"
elsif i%3==0
puts "Fizz"
elsif i%5==0
puts "Buzz"
else
puts i
end
end
初めに15で割り切れる数値で条件分岐していることに注意してください。(「よくある間違い」で解説)
実際にターミナルで実行して見ます。
mbp:Desktop miyacha$ ruby fizzbuzz.rb
1
2
Fizz
4
Buzz
...
Buzz
26
Fizz
28
29
FizzBuzz
mbp:Desktop miyacha$
3の倍数の時は「Fizz」、5の倍数の時は「Buzz」、15の倍数の時は「FizzBuzz」と返ってきています。
うまくできたみたいです。
よくある間違い
ファイルを次のコードに書き換えて、ターミナルで実行してみます。
(1..30).each do |i|
if i%3==0
puts "Fizz"
elsif i%5==0
puts "Buzz"
elsif i%15==0
puts "FizzBuzz"
else
puts i
end
end
ターミナルで実行してみます。
mbp:Desktop miyacha$ ruby fizzbuzz.rb
1
2
Fizz
4
Buzz
...
Buzz
26
Fizz
28
29
Fizz
mbp:Desktop miyacha$
15の倍数の時に、「FizzBuzz」と返ってきていないことがわかります。
これは最初に「3で割り切れる」という条件分岐を書いてしまっているため、 15と30が「3で割り切れる」の方で処理されてしまっています。
つまり、「15で割り切れる」を最初に条件分岐に持ってくることで、うまくいくようにしています。
まとめ
いかがでしたでしょうか?
今回は、FizzBuzzプログラムを作成しました。
みやちゃ
ここまでご覧いただきありがとうございます!