プログラムであえて間違って解く
今日ご紹介したいのは、数学者で有名なピーター・フランクルさんの著書 ピーターからの挑戦状 中学入試の算数 ~論理思考が身につく~ (知りたい!サイエンス) からの出題です。
関東学院中学校(神奈川県横浜市、2000年度問題の改題)
ABC
ACB
+DCC
CEDD
(1)上の足し算は3つの3ケタの整数の我が4ケタになったことを表しています。A,B,C,D,Eは、0,2,3,4,6,8のどれかの数を表し、同じ文字は同じ数、異なる文字は異なる数を表しています。このとき、Cは□、Dは□を表しています。
本来の解き方であれば、与えられた条件をもとに、ABCDEがそれぞれ取りうる値をどんどん絞り込んて行き
最終的に1つの解を導き出すと思います。
でも、あえて「よくない方法」で解いてみます。
A,B,C,D,Eは 0,2,3,4,6,8 のいずれかを乱数を発生させて決めます。
実際はCは合計の最上位の桁なので0はないし、Maxでも A=8 D=6 の 8+8+6=22 で、偶数だから
もう C =2 なのですが、そこも愚直に乱数発生させて決めます。
※子どもが最初、適当に数を入れて解こうとする感じをイメージしてみました。
合計した結果の数を、下1桁から4桁まで1桁ずつ取り出し、発生させた乱数と合致するか、合致したら終了しています。
paizaさんを利用させてもらい、最後にソース共有してみました。
始めて載せるのでうまくみえるかな、、、
かなり無理やり解いて、ソースもきれいではないので
もし我が子が見たら反面教師として見てほしい、、、
あと、プログラミングを勉強する過程で思い出したのですが、
「なぜこのコードが間違っているのか」
を考えることが良い勉強にもなっていたことを思い出したので、
あえて間違いのコードも作ってみました。
「1.誤検知するバージョン」 は、「同じ文字は同じ数、異なる文字は異なる数」を無視したため、
同じ数を許容して検出してしまうパターン
「2.正解が出せるバージョン」 は、1の問題を対策したものです。
でも、2.でもまだ問題があります。
・解を見つけたら終わっている。解が1つとはかぎらない
・乱数の発生具合によっては、見つからない可能性もある(何回も実行すればよいのですが、、)
・実装に時間がかかるかも(手で解くより最終的に答えが出るのが遅い)
子どもの算数教育法として、こういうのは面白いのではと考えています。
①まず、ノーヒントで考えさせる
②愚直に答えを求めるプログラム(でも間違いがある)をみせる。何が問題か考えてもらう。
③②の対策を行ったプログラムを書く(本人、もしくは先生)
④修正するなかで、本質的な問題に近づけるよう先生が誘導
⑤手で解けるようになる。
自分一人では解けない問題も、「他人(この場合は間違いのあるプログラム)の間違いを指摘する」となると、やる気もでてくるかもしれない。
DaiGoさんの著書 後悔しない超選択術 でも
「第三者の立場で考える」と認知能力は上がるし、合理的に物事を判断できる
と紹介されてました。
プログラミングを、単なる
「答えを解くための計算機」
にさせず、
「プログラミングによる間違いをみせることにより、間違いを指摘することで学力を向上させるきっかけ」
としても使っていけるのでは、と思いました。
1.誤検知するバージョン
2.正解が出せるバージョン