「10パズル解答アルゴリズム」とかつくったらおもしろそうじゃね?という話

 期末が目前に迫っている今(7/23現在)、こんなことをしている場合じゃないとは思いつつ私はコードを組んでいた。タイトルにもあるように、大学のプログラミングで教わったばかりのC#を用いて「10パズル」の解答を探し当てるアルゴリズムを無性に作りたくなったのだ。(徹夜テンションでついったーを見るのはやっぱりよくないね)
 「10パズル」とは簡単に言うと「4つの数字で10を作るゲーム」ということになる。具体的なルールを説明すると、

・まず1桁の数字からなる「1,2,3,4」などのランダムな4つの数字の組み合わせを用意する(車のナンバープレートや電車の切符など)。
・次にこの4つの数字の間に「+-×÷」などの四則演算子をかませる。
・4つの数字は必ず式中で1回だけ使う必要がある。
・計算に用いる順番を気にする必要はない(「4,2,3,1」とかでも同じこと)
・必要ならカッコを駆使して計算の順番をばらしても良い。

「1,2,3,4」の例をとって考えると単純に全部足した「1+2+3+4」や掛け算を使った「1×4+2×3」があるだろう。とにかく4つの数字を各1回ずつ使って四則計算で"=10"になる等式を作ろう、という数字パズルだ。

 しかしこれ、わざわざここで説明するまでもなく、これをプログラムでダァーーーっとやってバーーーっと答えが出せたら素敵じゃない?傍から見れば「いやそんなのにわざわざコード組まんでええやろ……」と言われそうな、ほんの一握りの変な人たちからしか需要なさそうな無意味さに、えも言われぬ魅力があっていい。こういうのでいいんだよこういうので。

 そして10パズルはその手軽さから、既に数学クラスタのみならず方々で遊び尽くされてしまっているらしい。4つの数字の全組み合わせ"程度"であればどこぞの暇人が解答一覧をつくってしまっているし、なんなら全パターンの計算を網羅して解答を導き出す「10パズル解答ジェネレーター」なるサイトも検索すればもうあった。

 ——あるじゃねーか!!!

と、思わず叫んでしまった。うーん、そりゃそうだよね、私なんかが思いつくことは既に誰かやってますよね。じゃあ、えっと今回やりたかったことは私がやるよりも前に誰かが達成してくれてたらしいので……まあ、そういうことなので、、今回の記事はこのへんで…………














と、なってはおもしろくないので。

 今回私がやりたいのは「拡張10パズル解答アルゴリズム」をつくることに路線変更。そもそも私はこの「4つの数字と四則計算のみで10をつくる」って基本ルールがイマイチ気に入らない。自由度低くね?小学生とか算数が苦手な方の暇つぶしならちょうどいいと思うけど(算数苦手な方はあんまりやらんだろ)数字パズルってもうちょっと幅広い要素あってもいいと思うんですよ。それと解答がつくれない問題とか、「ここで指数つかえば10になるじゃん!!」みたいなもどかしさがあるやつ多すぎ。
 いろいろと調べていると10パズルにはいくつかローカルルールと言えるような特殊ルールがあることが分かった。今回はそれらを参考に個人的に組み入れたい特殊追加ルールを以下のように考えた。

 ・2つの数字を組み合わせて2桁の数字とみなしてもよい。
  「0001」の場合、「10+0+0」としてもよい
 ・分数を用いても良い
  「1158」の場合、「8/(1-(1/5))」としてもよい
 ・計算にべき乗を用いてもよい。
  「1023」の場合、「1+0+3^2」としてもよい

これでかなり解答の幅が広がった気がする。このルールを適応した場合に実際どれくらいの問題が解けるようになるのかはわかりません。それが知りたいってのもプログラム組みたくなった理由の一つではあるけど。ただこれでもわざわざプログラム組む労力には微妙に釣り合ってない気がする。なのでここでもう1つ汎用性をブチ上げるために問題を拡張します。

 ・m個の数字を用いてnをつくる(mは自然数。nは整数)
  10個の数字「1,1,1,2,3,3,3,3,9,0」を用いて1729をつくる、など

……面白そう。いやすぐに断念しそう。
まあできなかったときには諦めるだろうしなんなら上に書いた3つのルールで十分詰んでる。条件式やらアルゴリズムの知識やら部品が全然たりてない。なかなか骨が折れそう。唆るぜこれは。

 などと私のテンションが上がってコードの続きが書きたくなったところで今回は筆を置こうと思います。次回はすこしばかり進展があったときに更新するかもしれません。たぶんはやくとも8月はじめとかその辺です。その間に誰かが完成させてたら泣く。

それではごきげんよう、さようなら。

この記事が気に入ったらサポートをしてみませんか?