テンパズル(10パズル)は、4桁の数字を一桁の数字4つとみなし、これに四則演算などを用いて10を作る遊び。メイクテン(make10)とも呼ばれる。切符の番号や車のナンバープレートなどでの短時間の遊びに利用され、日本経済新聞で渋滞時の時間の潰し方として紹介されたことがある。同様に、人気のある「Make 24」ゲームが存在する。 make24.org ではオンラインで「24ゲーム」を遊ぶことができる。このバージョンは、元の形式を基に複素数や追加の演算を拡張している。その特徴として、難易度レベルの設定、多くの興味深く非常に難解な問題の作成、ユーザーインターフェースにおける工夫、そしてヒント機能の提供が挙げられる。
一般的なルール
一般的なルールとしては、四則演算のみの使用を許可し、数字の並べ替えも許可されるが、数字の結合は許可されない。一般的なルールの場合、全715通り中552通りの組み合わせ(並べ替えたものを数えると全10000通り中8147通り)で10を作ることができる。解き方を1つでも見つければ正解となるが、使っていない数字があった場合は正解にならない。
(例.) 1358:(解き方の一例) :(解ければどのような解き方でもよい)
数字は自由に並べ替えてもよいので、例えば「1358」と「5381」は同じ問題となる。
特殊ルール
地方ルールもしくは特殊ルールとして、指数関数や数学の記号(べき乗や!(階乗)など)の使用を許可することや、連続した数字をつなげて2桁の数字として扱うなどの応用もある。この場合はさらに10を作ることの出来る組み合わせが増える。大抵は一般的ルールで解けなかった場合にルールの拡張が行われる傾向がある。
(例.) 0123:(指数関数を使った例) 1111:(最初の連続した1を2桁の数字として扱った例)
これらはあくまで特殊ルールであり、この方法でのみ解ける場合に「解ける」とはしない。ちなみに、数字を連結させた場合は、連結させない場合に加えて新たに70通り解ける組み合わせが増える。
逆に作ることの出来る組み合わせを減らす特殊ルールとして、数字の並べ替えを許可しない問題も存在する。この場合はマイナス記号を数字の前に置くことを許すかどうかというサブルールが別途規定されるが、マイナス記号は四則演算ではないためにマイナス記号が許可されないのが一般的である。なお、数字の並べ替えを許可せず、マイナス記号も許可しなかった場合、10000通り中5878通りで10を作ることが出来るが、それぞれの数字の難易度は桁違いに高くなる。
(例.) 1358:(マイナス記号が許可された場合の一例) :(マイナス記号が許可されない場合、1358の例ではこの方法のみ可能)
他にも、10以外の数字を作ったり、5桁以上の数から10を作ったりするルールも存在する。例えば16を作るルールは10を作るルールに比べて難易度は若干上昇する。5桁以上の数字から10を作る場合、数字の数が増えることにより難易度が大幅に低減する。
その他
ものによって解けるもの、解けないものが存在する上に、コンピュータを使わずに解けないことを証明することが極めて難しいために、出先などで切符やナンバープレートなどで解けそうで解けない番号に当たってしまったときは、非常に歯がゆい思いをすることが多い。解けるかどうかを見分ける一つの方法として、「0を含まない、互いに相異なる4つの数の場合は必ず解ける」ことが知られている。また、演算の途中経過が整数の範囲では解けなくとも、有理数の範囲で解ける問題も複数存在する。
解ける問題に対して難易度を定義するのも難しい問題である。一般的に加法や乗法などの交換法則が成立する演算子を利用して解ける場合は解法の種類が多く解きやすい。逆に減法や除法など交換法則が成立しない演算子を利用する解法のみでしか解けない問題は一般的に難易度が高く、パズルとして出題される場合は大抵このパターンであるが、難しい問題の中にも加法と乗法のみで解が導き出せる例も存在する。
一般に難易度は「解ける解法が少ない」という形で定義されるが、その場合、一般的なルールでは大抵の人間が直感的に解ける1116が難問に分類されてしまう不具合もあり、画一的な難易度の指標は確立されていない。
コンピュータによる解法 解法自体はそれほど難しくないが、それをコンピュータ上に実装するための方法が難しい。とくに「整数の範囲内では解けないが分数(有理数)の範囲では解ける」ケースが存在する点が難関となる。そのため有理数を計算できる電卓プログラム(Forthを参照のこと)を実装することが要求される。
解を得るための手順としては、 「1・2・3・4」から「6・7・8・9」までの順列を生成する(126通りある)。 それぞれの数から、組合せを生成する。これは24通りある。 各組合せに対して、Forth 言語として意味のある式(数値四つ+演算子三つの7要素である)をすべて生成する(最初の二つは数字であり、最後のひとつは演算子である)。 その式をすべて評価し、解が10と一致するもののみを選ぶ。 Forth 式を(括弧)のある式に変換する。
プログラム・アルゴリズムの分野では、逆ポーランド記法(後置記法)やスタックの例題として取り上げられることがあるが、プログラミング初級者にはほとんど歯が立たない。「逆ポーランド記法を評価できる仮想的マシンを実装し、そのプログラミング言語を生成するシステムを作る」といった言語処理系想定する方法が有効なので、システムエンジニアに対しては有効な課題である。Java などのオブジェクト志向プログラミング言語ではコンテナクラスもあり扱いやすいが、C 言語のような言語処理系においては、時間・空間計算量などの見積もりが大変であったため、「複数のプログラム間をファイル渡し(または標準入出力渡し)して解決する」という手法もあった。
参考資料 一般的なルールで10を作れる552個の数字の組み合わせ
1.001900250028003700460055011501180119012401250126012701280129013301350136013701382.013901450146014701490155015601590169017901890199022302240225022602270228022902343.023502370238023902440245024602470248024902550256025702580259026602670268027802884.028903340337033903460347034903550356035703580367036803770378037904460449045504565.045804590466046704680469047704880555055605570558055905680569057805790669067906886.077907890889089909991114111511161117111811191123112411251126112711281129113311347.113511361137113811391144114511461147114811491155115611571158116611671168118911998.122212231224122512261227122812291233123412351236123712381239124412451246124712489.1249125512561257125812591266126712681269127712781279128812891299133313341335133610.1337133813391344134513461347134813491355135613571358135913661367136813691377137811.1379138813891445144614471448144914551456145714581459146614671468146914771478147912.1488148915551556155715581559156615671568156915771578157915881589159916681669167813.1679168816891778177917881789179918881889189919992222222322242225222622272228222914.2233223422352236223722382239224422452246224722482249225522562258225922662267226815.2269227722782279228822892299233323342335233623372338233923442345234623472348234916.2355235623572358235923662367236823692377237823792388238923992444244524462447244817.2449245524562457245824592466246724682469247724782479248824892499255525562557255818.2559256625672568256925772578257925882589259926662667266826692677267826792688268919.2699277727782779278827892799288828892899299933333334333533363337333833393344334520.3346334733483349335533563357335833593366336733683369337733783379338833893399344521.3446344734483449345534563457345834593466346734683469347734783479348834893499355522.3556355735583559356635673568356935773578357935883589359936663667366836773678367923.3688368936993777377837883789379938883889389944454446444744484449445544564457445824.4466446744684469447844794488448944994555455645574559456645674568456945774578457925.4588458945994666466746684669467746784679468846894699477747784779478847894799488826.4889555555565557555855595566556755685569557755785579558855895599566656675669567727.5678567956885689569957775778577957895888588959996668666966786679668866896699677928.678867896799688977787779788978998888888989999999
以下は、一般的なルールで10を作れない163個の数字の組み合わせ。
1.00000001000200030004000500060007000800092.00110012001300140015001600170018002200233.00240026002700290033003400350036003800394.00440045004700480049005600570058005900665.00670068006900770078007900880089009901116.01120113011401160117012201230134014401487.01570158016601670168017701780188022202338.02360269027702790299033303350336033803449.034503480359036603690388038903990444044510.044704480457047804790489049905660567057711.058805890599066606670668067706780689069912.077707780788079908881111111211131122115913.116911771178117911881399144414991666166714.167716991777225734443669377939994444445915.447745584899499956685788579958996666666716.667767776778688868996999777777887789779917.788879998899
以下は、一般的なルールでは10を作れないが、数字を連結させるルールでは10を作れる70個の数字の組み合わせ
1.00010011001200130014001500160017001800222.00230033003400440045005600660067007700783.00880089009901110112012201230134014401584.01660167017701780188023602790336034503695.04480457058911111112112211591177117811886.14441666177722573444366937794444445944777.6666666766776777777777887789779978888899
脚注
関連項目 乗車券 パズル 組合せ (数学) アルゴリズム プログラミング (コンピュータ) 逆ポーランド記法(後置記法) スタック