2016/08/12
スクラッチで算数の問題を解いてみよう
東京都渋谷区にある小学生対象のプログラミング教室スモールトレインで講師をしております福井です。今回はスクラッチで算数の問題を解いてみましょう。プログラミング教室スモールトレインは算数の要素が入った問題をプログラミングするのが中心です。算数をプログラミングすることで、算数そのものにも積極的に取り組んでもらうことを目的としています。また、算数の問題に取り組むことで考え方を身につける事ができます。
では、今回の問題は以下の問題です。スクラッチがある方はスクラッチで、紙の上で解きたい方は紙を用意して下さい。
オリンピックのマークは、青色、黄色、黒色、緑色、赤色の5色で描かれています。同じ形のマークを自分のペンを使って描いてみることにしましたが、赤色のペンがありませんでした。そこで、赤色以外の4色のペンで描くことにしました。いま、下の図のように、まん中の輪を黒色で描いたあと、次のようなことを考えました。残りの輪を黒色を含む3色で描くことにした場合、同じ色の輪が交わることのないようにするには全部で何通り考えられますか。(渋谷教育学園幕張2005年)
さて、皆さんはどのように解きますか?こちらを3色で塗り分けですわけですが、プログラミングとして思いつくやり方は例えば以下のようなやり方でしょう。
- 青、黄、黒、緑で五輪マークを塗る組み合わせをすべて出す
- そのうち真ん中が黒以外のものは消去
- そのうち4色すべてを使っているものは消去
- そのうち色が隣り合っているものは消去
- 残っているものを出力
さてこれで一見良さそうですが、これではダメです。ひとつ条件が抜けています。何か分かりましたか?これだと例えば「黒緑黒緑黒」という組み合わせが入ってきてしまいます。これは2色で塗り分けられていますよね。ということは3色で塗り分けるという条件を入れなければなりません。
- 青、黄、黒、緑で五輪マークを塗る組み合わせをすべて出す
- そのうち真ん中が黒以外のものは消去
- そのうち4色すべてを使っているものは消去
- そのうち色が隣り合っているものは消去
- 3色使っているものを出力
これをプログラミングすると答えが出てきます。答えは30通りです。
さてここでもう少し考えてみましょう。真ん中に黒があります。それ以外の輪を黒を含めた3色で塗り分けるわけですから、黒を真ん中に隣り合わない輪に塗らなければなりません。つまりは一番左と一番右の輪です。ですので、場合分けとしては①一番左の輪が黒の場合、②一番右の輪が黒の場合、③両方が黒の場合と3通り考えられます。この処理を最初にしてしまうとコードがグッと短くなります。
- 青、黄、黒、緑で五輪マークを塗る組み合わせをすべて出す
- そのうち真ん中が黒・1、5番目が黒の場合、真ん中が黒・1番目が黒の場合、真ん中が黒・5番目が黒の場合は残し、それ以外は消去する。
- そのうち4色すべてを使っているものは消去
- そのうち色が隣り合っているものは消去
- 3色使っているものを出力
こちらはまだ改善余地があります。先ほど問題になりました「黒緑黒緑黒」を5番目の処理で消去しているのですが、今回のコードの場合、2番目の処理の際に一緒に消すことができます。実は2色になる場合は、このコードの書き方の場合、「黒○黒○黒」しかありません。例えば「黒白黒白白」は4番目の処理で消去されます。ということで以下の処理をします。
- 青、黄、黒、緑で五輪マークを塗る組み合わせをすべて出す
- そのうち1・3・5番目が黒の場合、1・3番目が黒の場合、1・5番目が黒の場合は残し、それ以外は消去する。さらに1・3・5番目が黒の場合で2・4番目が同じ色の場合は消去する
- そのうち4色すべてを使っているものは消去
- そのうち色が隣り合っているものは消去
答えはめでたく先ほどと同じになりました。これぐらいの分量ですと計算スピードには差はできないですが、コードが長いと分かりにくいですよね。また、算数の問題の場合、プログラミングをした後に、そのデータを見て規則を発見すれば、もっと短い、効率的なコードが書けますよね。算数の勉強にもなりますし、大変面白いと思います。問題も中学入試の問題です。
今回はスクラッチのコードを全部載せるのは長いので止めておきますが、ご興味がある方は説明会に来てください。現在、プログラミング教室スモールトレインでは、説明会&体験会を実施中です。8月の説明会&体験会は8月17日(水)~19日(金)です。