難しそうな数字パズルをプログラミングで解く話

2024/09/19

プログラミング

t f B! P L
eyecatch ネットニュースで、数字クイズを見かけました。 次のようなクイズです。 30秒で「こんなに複雑な算数パズル」解く人のなぜ 「気づいたときの快感」で数字のセンスを高める
参考 : https://toyokeizai.net/articles/-/821180 このクイズの正解は、上記サイトに書かれているので、数学的な解き方を知りたい方は見て理解しましょう。 ここでは、このクイズを、プログラミングで解いてみたいと思います。

問題をプログラミング化する

プログラミングは論理的な数式というよりも、知りたい数字を総当りで調べるという方が簡単に考えられます。 この問題で知りたい答えというのは、ABCDEFそれぞれの数字1桁ということになるので、 AからFの変数6個で、それぞれがカブらないモノを総当りで調べればいいワケです。 そして、ABCDEF × 3 = BCDEFAという、数字の組み合わせが同じになることを条件にできればいいんです。 という事で、Javascriptで作ったプログラムは、次のようになります。 const results = [] for(var A=0; A<=9; A++){ for(var B=0; B<=9; B++){ if(A === B){continue} for(var C=0; C<=9; C++){ if(A === C || B === C){continue} for(var D=0; D<=9; D++){ if(A === D || B === D || C === D){continue} for(var E=0; E<=9; E++){ if(A === E || B === E || C === E || D === E){continue} for(var F=0; F<=9; F++){ if(A === F || B === F || C === F || D === F || E === F){continue} const num1 = A * 100000 + B * 10000 + C * 1000 + D * 100 + E * 10 + F const num2 = B * 100000 + C * 10000 + D * 1000 + E * 100 + F * 10 + A if(num1 * 3 === num2){ results.push({ num1 : num1, num2 : num2, A : A, B : B, C : C, D : D, E : E, F : F, }) } } } } } } } console.log(results)

結果

> results [ { A : 1, B : 4, C : 2, D : 8, E : 5, F : 7, num1 : 142857, num2 : 428571 }, { A : 2, B : 8, C : 5, D : 7, E : 1, F : 4, num1 : 285714, num2 : 857142 } ] 上記2つの答えが出ました。 問題が書かれているページと同じ結果でしたね。

解説

少しベタで、ダラダラとしたプログラムを書きましたが、初心者でもわかりやすく書いてみたつもりです。 ABCDEFが0~9までの数字が入るので、それぞれfor文でぶん回して、同じ値になる数値を除外(continue)するようにしています。 そして、全ての数字が出揃った段階で、ABCDEFとBCDEFAをそれぞれ数値として足した数を算出。 さらにif文で、片方に3を掛けた数と同じ値になれば、結果を事前に準備していた配列変数(results)に追加登録する。 最後に、resultsをconsole.logで表示してあげれば、結果を簡単に見ることができます。 結果は、HTMLとして出力してもいいですが、今回は、計算式作成と結果が知りたかったのでここで留めておきました。

あとがき

プログラムを実行して、即座に答えが出たので、改めてコンピュータの処理演算のスピードに驚かされますね。 算術をしっかり理解していれば、細かな計算をコンピュータにやってもらうというのは、人間と機械の良い関係性でしょう。 ということで、プログラムは、この先に汎用性という事を考えることができます。 例えば、今回は3を掛けた時にABCDEFとBCDEFAが同じ数字になるという問題でしたが、これが、2だった時は、どうなるでしょう? num1 * 3 === num2 この箇所を次のようにするだけで、答えが出ます。 num1 * 2 === num2 でも、実はこの問題の答えは、3しか無いということがわかるでしょう。 2にしても回答は0件です。 でも、これも、プログラミングだからこそわかるという事ですね。 今回の問題は算術式が理解できなくても、プログラミングしてしまえば結果が得られるという、典型的な数学がわからなくてもプログラミングができてしまう例としても分かってもらえると、 これからプロウグラミングを始めたいけど、算数が苦手という人は、今回のように全く恐れる必要はないんですよね。 もちろん、プログラミングを始めると、算数の勉強をすることにはなると思うので、やりたくない人は、プログラミング向いていない人なので、諦めてください。 そもそも、算数や数学が苦手で嫌いな人って、今回のようなクイズを見てもワクワクしない人ですからね。 このブログも読まないことでしょう。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ