プログラミングの代表的な問題「FizzBuzz」にチャレンジしてみよう!

プログラミングを勉強していると、多かれ少なかれ出会うのがこのFizzBuzz問題です。

この問題は基本的なプログラミングの能力を問うのによく使われており、この問題を学ぶことで、プログラミングのエッセンスを学べます。

では早速、問題に挑戦してみましょう!

FzzBuzz問題文

1から100の整数値を表示させなさい。ただし3の倍数は数字の代わりに”Fizz”、5の倍数は”Buzz”、15の倍数は”FizzBuzz”とそれぞれ表示させなさい。

では考えてみてください。

 

問題のポイント

この問題を解くためにポイントが3つ

  1. メソッドを使用して呼び出す
  2. 1から100の整数値を表示させる
  3. 倍数値での分岐

まずこの問題を解くには、どうやって1から100の整数値を表示させるかを考えましょう。これは根本的な話ですね。全部の数字を全部の手打ちするのは面倒なので、アルゴリズムを使って連続で数字を表示させる方法を考えてみます。

そして整数値の分岐が次のポイントになります。考えるべきは「3と5と15の倍数」という条件を、アルゴリズムを用いてどう制御してくのかが次なるポイントといえます。ここはプログラミング的思考が求められるので、頭の体操にぜひとも取り組んでみてください。

 

一番初めに「メソッドを使用して」という記述があります。今回のFizzBuzz問題での雛形は下にものを使用してみてください。

 

 

解答

laptop-926775_1280

一つ目の解答を示します。これはごく一般的な解答例なので、一番初めにマスターしておきましょう。今回はRubyでコードを書いておこうと思います。

 

 

解説

さて、この問題を解くための一つ目のポイントは「どうやって1から100の整数値を表示させるか」でした。この場合は条件がかなり明確なので、while文を使用して1から100の整数値を連続で表示させることにしました。

 

Whileを考えてみる

ではまず、最初のwhileについて考えていきます。構文は難しくないので特段として覚える必要はありませんが一つだけ注意すべきところがあります。

whileの次には条件式が書き記されています。この例ではi <= 100ですね。これはiが100以下の場合に繰り返す、という意味が書き加えられています。この条件式を指示通りに指定しないと、永久ループとなってしまう場合があるので気をつけましょう。

 

倍数の定義を考えてみよう

ポイントは倍数をどのように捉えるかでした。コードを見てもらえればわかると思いますが、倍数を定義する部分に%を使用しています。この%という演算子は、「ある数を割った時の余りを求める演算子」という覚えているはずです。

倍数を定義するには、この演算子を使用して条件を設定します。%を使用して倍数を定義する場合、例えば3の倍数とすると、ソースの通り「3で割った余りがゼロ」という定義になります。

もしこの意味がわからないのであれば、プログラミングの前に小学校の算数を復習する必要がありますね。それ以降に関してはコードの通りです。ifの後に続く条件を満たした場合に、その中に書かれている処理が行われます。

合わせてif~elsif~elseの構文についても、しっかりと復習をしておきましょう。

 

条件の順番にも注目しよう

次に考えるべきは、なぜ一番初めの条件がi %3 == 0 && i %5==0となっているのか、ということです。

結論から言ってしまうと「15の倍数を先に拾うため」です。なぜそうする必要があるのでしょうか。もうお気づきかもしれませんが、15で割った余りがゼロという条件は3や5の倍数を判定する条件も同時に満たしてしまうからです。

 

例えば15が来たときのことを想定してみましょう。もし3の倍数の条件を上に置いてあった場合は”Fizz”、5の倍数の条件を置いてあった場合は”Buzz”と、それぞれ意図しているものとは別の結果が表示されてしまいます。

もう一つの理由としてif ~ elsif ~ elseの設定も挙げられます。if ~ elsif ~ elseは、一つの条件を満たして処理を行ってしまうと、処理の終了後にはif ~ endの構造自体から抜けてしまうというものがあります。そのため、先に3や5の倍数の判定を設けてしまうと、15の倍数を求める判定まで届かずにif文から抜けることになってしまうのです。

これを防ぐために先に15の倍数の判定条件をおいています。

 

またメソッドについてわからない!という人は、別の記事である「【Ruby】とても大事!メソッドの基本的な使い方を復習しておこう」もぜひ参考にしてみてください。

【Ruby】とても大事!メソッドの基本的な使い方を復習しておこう

 

別解について

directory-1699948_1280

また、もう一つの回答例をここに示しておきます。これはAtmarkITで連載されている池澤あやかさんの記事「うつくし過ぎるプログラマー「池澤あやか」は、この先生きのこれるか。ドワンゴのエンジニア兼、人事に聞いてみた」を参考にしています。

ドワンゴの塩谷さんの「出力文字列用の変数を『空文字』として用意しておき、条件に応じて文字列を『concat』していったらどうなるか?」というアドバイスをそのままに書いてみました。

一般的な解法とは言えませんが、コードも少なくてとてもスッキリしているソースです。頭の片隅にでも入れておくと、コードの引き出しが広がって良いかもしれません。ただし解説については行わないので各自で考えてみてください。

なおこのFIzzBuzz問題のサンプルコードはこちらからダウンロードできます。どうしても動かない場合や、解答を確認してみたい人は自由にダウンロードしてコードを走らせてみてください。

また他のサイトで掲載することも良しとしていますが、使用する場合は「サイト名:Theoretical」と「URL:https://www.tomx234.com/」を必ず明記していることを確認してください。

 

まとめ

プログラミングを学習していたら、必ずと言っていいほど出くわすFizzBuzz問題。あなたは解くことができたでしょうか。

もし難しいと思っても大丈夫です。メモ帳やテキストエディタで何回か書き写して覚えてみてください。知らず知らずのうちにコードの意味を理解しているはずです。まずは手本を真似てみることが成功の秘訣です。

焦ることなく一歩一歩を踏みしめながらプログラミングを学習していきましょう!

この記事が気に入ったら
いいね ! しよう

Twitter で
SPONSORED LINK

ABOUTこの記事をかいた人

旅・音楽・プログラミング・ブログを愛するコンテンツ・クリエーター。フィリピンで就業、カナダで語学留学を経験しニュージーランドで大学を卒業。 TECH::CAMPの二十九期生としてRuby / Ruby on Railsを勉強しました。記事の執筆・広告は「お問い合わせ」からお願いします。