# 例題: FizzBuzz問題

プログラミングの典型的な例題であるFizzBuzz問題をScratch(スクラッチ)でやってみましょう。

FizzBuzz(フィズバズ)とは英語圏で行われる次のようなゲームです。

  • 何人かの参加者が順番に数字を1から順番に言う
  • ただし、3で割り切れる時は数字ではなく「Fizz」、5で割り切れる時は「Buzz」、両方で割り切れる時は「FizzBuzz」と言う
  • 間違えた人から脱落していき、最後に残った人が優勝

プログラミングの例題としては、数字を1から順に増やしながら上記のルールにそって文字列を出力する感じになります。 繰り返し(ループ)と条件分岐を使えば実装することができます。

FIzzBuzz問題はIT業界でも普段プログラミングをしない人は意外と書けないことがあり、「プログラマ職の応募者の中からコードが書けない人を見分ける方法として使える」みたいな話もあったりして有名です。

# スプライトに数字を言わせる

出力方法として、ここではスプライトに言わせる形式としてみます。 たぶんこれが分かりやすくて楽しいので。

Scratch(スクラッチ)スプライトに数字を言わせる

  • プログラム開始時に変数に0を代入
  • 変数が30になるまで以下を繰り返す
    • 変数を1ずつ変える(増やす、インクリメント)
    • スプライトが1秒かけて変数を言う

これで猫が1から30まで30秒間かけて数えるプログラムはできました。

# 条件分岐させる

FizzBuzzの条件部分の実装は意外とややこしいです。やり方は何通りかありそうですが、ここでは次の方法を採用します。

  • 変数が15で割り切れる時は「FizzBuzz」と言う
  • ここまでの条件を満たさず、変数が3で割り切れる時は「Fizz」言う
  • ここまでの条件を満たさず、変数が5で割り切れる時は「Buzz」言う
  • ここまでの条件を満たなければ、変数をそのまま数字として言う

この処理をScratch(スクラッチ)で書くと次のようになります。

Scratch(スクラッチ)FizzBuzz問題の条件分岐

構造としては条件分岐ブロック「もし〜なら、でなければ」を多段に組み合わせて、条件式の内容は変数を15で割った余りを0と比較するという演算になっています。 似たコードが多くてドラッグアンドドロップするのが面倒なんですが、実はCtrl+CとCtrl+vでブロックのコピーアンドペーストができるので、それを使えば楽です。

# 完成版FizzBuzz

ループ中で数字をそのまま言っていた部分を、条件分岐するもので置き換えると完成です。

Scratch(スクラッチ)でのFizzBuzz問題の実装例

完成したプログラムのScratch(スクラッチ)プロジェクトを共有しているのでよかったらご覧ください→FizzBuzz問題

# おまけ: C++でFizzBuzz

ここで紹介したFizzBuzz問題のScratchプログラムと同等の処理を行うC++のプログラムを掲載します。 眺めてみて「Scratchと同じだなぁ」と思っていただければオッケーです。

#include <iostream>

using namespace std;

int main(void) {
  for (int i = 1; i <= 30; i++) {
    if (i % 15 == 0) {
      cout << "FizzBuzz" << endl;
    } else if (i % 3 == 0) {
      cout << "Fizz" << endl;
    } else if (i % 5 == 0) {
      cout << "Buzz" << endl;
    } else {
      cout << i << endl;
    }
  }
  return 0;
}

実行結果

$ ./a.out
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz