プログラミング初心者の子供に何を教えたらいいの?とお悩みの保護者のためのScratch(スクラッチ)の入門講座。Scratchで猫の動かし方はわかったけど・・・次にどんなことをしたらいいの?という疑問にお答えするシリーズです。
今回は「FizzBuzz」問題のアルゴリズムを考えてみたいと思います。
1. アルゴリズムって何?
1-1. アルゴリズムとは?
アルゴリズムとは問題を解くための手順です。今回は「パタトクカシーー問題」を解くための手順を考えます。つまり問題のアルゴリズムを考えるのです。
アルゴリズムは、問題を解くための手順なので一つの問題に対してたくさんのアルゴリズムがあります。そして、アルゴリズムには「良いアルゴリズム」と「悪いアルゴリズム」があります。
良いアルゴリズムの定義は人や時代によって様々ですが、多くの人が以下のような点を挙げています。
・早い
・短い
・わかりやすい
・再利用できる
1-2. FizzBuzz(フィズバズ)問題って何?
Wikipedhiaによれば英語圏の国での言葉遊びだそうです。日本でいうと古今東西みたいなゲームのようです(ちょっと違いますけど)。最近ではプログラマーの素養を見る基礎的な問題としてこの手の問題を目にするようになりました。
1から順番に数を言っていくのですが、3の倍数のときはFizz、5の倍数の時はBuzzといいます。3と5の公倍数の時はFizzBuzzと言います。
▼参考
https://ja.wikipedia.org/wiki/Fizz_Buzz
2. FizzBuzz(フィズバズ)問題を考える
ではここから実際にFizzBuzz問題を考えて、Scratchで作っていきましょう。
2-1. 完成イメージを固める
さて、FizzBuzz問題をScratchでも作ろう!と決めてもいきなり作り出すことはできません。どんな風につくるのか、プログラムのイメージを固めておきましょう。今回は次のようなプログラムを作りたいと思います。
・スプライトが1から20までの数を言う。(①)ただし・・・
→3の倍数のときはFizzと言う(②)
→5の倍数のときはBuzzと言う(③)
→3と5の公倍数のときはFizzBuzzと言う(④)
あとは①〜④を順番に作っていくだけです。
2-2. スプライトが数を順番に言うプログラム
数が増える、といえばScratchでは変数とこのブロックを使います。これはもうパターンとして覚えてしまってもいいぐらいです。
今回は「かず」という変数を使っています。
「1から20まで増えていく」は「1づつ変える」を20回繰り返せば良さそうですね。ですからこんなプログラムになります。
ここに変数「かず」の中身を言うプログラムを追加すると・・・
はい。これで1から20までの数を言うプログラムができました。プログラムを実行すると、ちゃんとスプライトが数を言ってくれます。
2-3. 3の倍数の時だけFizzと言う
さて、次は3の倍数です。3の倍数はどう表すかというと、「●を▲割った余り」ブロックを使います。3の倍数は、3で割った時の余りが0になる数です。
この条件式が当てはまる時に「Fizz」と言うようにしましょう。「もし●●ならーでなければ」ブロックを使って、3の倍数ならFizz、そうでなければ変数「かず」の中身を言うようにします。
2-4. 5の倍数の時だけBuzzと言う
さて、3の倍数は先ほどやりましたので、5の倍数はこうなりますね。
そして、先ほどと同様「もし●●ならーでなければ」を使います。こんな感じになります。
2-5. 3と5の公倍数の時だけFizzBuzzと言う
次は公倍数です。公倍数は「かつ」を使ってこう表します。
ですが、3と5の公倍数=15の倍数なので、次のように表現してもOKです。
こちらも先ほどと同様「もし●●ならーでなければ」を使います。ブロックが一番外側になるようにしましょう。
はい!これで完成です。変数「かず」が15の時に、ちゃんとFizzBuzzと言っています。
3. 「世界のナベアツ」問題を考える
FizzBuzz問題ができたら、こちらにも挑戦して見てくださいね。今度は3の倍数と「3のつく数字」です。ちょっと難しくなりますよ。
3-1. 「世界のナベアツ」って誰?
10年ほど前に「世界のナベアツ」という名前の芸人さんが「3の倍数と3のつく数字の時にだけアホになる」というギャグが流行っていたのを覚えていらっしゃいますか?ナベアツさんも桂三度に改名し、落語家さんになってしまいました。時代の変化は早いですね。
さて「3の倍数と3のつく数字の時にだけアホになる」というこのギャグですが、非常にFizzBuzz問題に似ています。いろいろなパターンもありましたね。
「3の倍数と3のつく数字の時にだけアホになり、5の倍数の時だけ犬っぽくなる」などいろいろなバリエーションがありました。当時の子供たちはこれで3の倍数を覚えたことでしょう。
さて、FizzBuzz問題によく似たこちらの「3の倍数と3のつく数字の時にだけアホになる」をScratchで作ってみたいと思います!
3-2. 「アホになる」をScratchでどう表現するか?
先ほどのFizzBuzz問題では3の倍数の時は、「Fizzと言う」でしたが今度は「アホになる」です。さて、これをScratchでどう表現したらよいでしょうか?これは、発想力が問われますね。
(1)録音機能を使ってアホっぽい声を録音する
(2)アホっぽいコスチュームをスプライトに追加する
(3)画像の効果でアホっぽくする
こんなアイデアを思いつきました。今回は「(2)アホっぽいコスチュームをスプライトに追加する」方式をとってみようと思います。
3-3. 完成イメージを固める
世界のナベアツ問題もどんな風につくるのか、プログラムのイメージを固めておきましょう。今回は次のようなプログラムを作りたいと思います。
・スプライトが1から40までの数を言う。(①)ただし・・・
→3の倍数のときはアホなコスチュームになる(②)
→3が付く数字のときもアホなコスチュームになる(③)
ではこの手順で作っていきましょう。
3-4. コスチュームを追加する。
まずは、スプライトにアホになったときのコスチュームを追加します。元の絵をコピーして、線を変形させてみましたが・・・あまりアホっぽくなりませんでした。
3-5. 3の倍数の時アホになる
コスチュームができてしまえば、FizzBuzz問題のプログラムを参考に、3の倍数のときだけアホになる=コスチュームが変わるプログラムを作ればOKです。
このプログラムを実行すると・・・3の倍数の時にスプライトがアホになりました。
3-6. 3がつく数字の時アホになる
次は、「3がつく数字」です。これは「●番目(▲▲)の文字」ブロックを使いましょう。
以下の2つの条件のうちどちらか1つを満たせば「3がつく数字」です。
「2つの条件のうちか1つを満たせばよい」は「または」を使います。つぎの条件式に当てはまる時、アホになるようにしましょう。
先ほどと同様「もし●●ならーでなければ」を使いましょう。プログラムはこのようになります。
このプログラムを実行すると・・・3がつく数字の時もアホになりました!
5. まとめ
今回は、FizzBuzz問題のアルゴリズムを考えてみました。
ポイントは以下の2つです。
・倍数=「●を▲で割った余り」ブロックで求める
・3がつく数=「●番目(▲▲)の文字」ブロックで求める
ここに気づけないお子さんも多いと思いますが、心配しなくて大丈夫です。真似をしたり、たくさんいろいろなゲームを作ったりしていくなかで、自分なりに答えを見つけ出す方法を編み出してくれると思います。
アルゴリズムがわからない!思いつかない!というときには親子で考えて楽しく試行錯誤する体験が大切だと考えています。ぜひ、いろいろなアイデアを試してみてくださいね。