テンパズル

テンパズル(10パズル)は、4桁の数字を一桁の数字4つとみなし、これに四則演算などを用いて10を作る遊び。メイクテン(make10)とも呼ばれる。切符の番号や車のナンバープレートなどでの短時間の遊びに利用され、日本経済新聞で渋滞時の時間の潰し方として紹介されたことがある。

一般的なルール

一般的なルールとしては、四則演算のみの使用を許可し、数字の並べ替えも許可されるが、数字の結合は許可されない。一般的なルールの場合、全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.00190025002800370046005501150118011901240125012601270128012901330135013601370138
2.01390145014601470149015501560159016901790189019902230224022502260227022802290234
3.02350237023802390244024502460247024802490255025602570258025902660267026802780288
4.02890334033703390346034703490355035603570358036703680377037803790446044904550456
5.04580459046604670468046904770488055505560557055805590568056905780579066906790688
6.07790789088908990999111411151116111711181119112311241125112611271128112911331134
7.11351136113711381139114411451146114711481149115511561157115811661167116811891199
8.12221223122412251226122712281229123312341235123612371238123912441245124612471248
9.12491255125612571258125912661267126812691277127812791288128912991333133413351336
10.13371338133913441345134613471348134913551356135713581359136613671368136913771378
11.13791388138914451446144714481449145514561457145814591466146714681469147714781479
12.14881489155515561557155815591566156715681569157715781579158815891599166816691678
13.16791688168917781779178817891799188818891899199922222223222422252226222722282229
14.22332234223522362237223822392244224522462247224822492255225622582259226622672268
15.22692277227822792288228922992333233423352336233723382339234423452346234723482349
16.23552356235723582359236623672368236923772378237923882389239924442445244624472448
17.24492455245624572458245924662467246824692477247824792488248924992555255625572558
18.25592566256725682569257725782579258825892599266626672668266926772678267926882689
19.26992777277827792788278927992888288928992999333333343335333633373338333933443345
20.33463347334833493355335633573358335933663367336833693377337833793388338933993445
21.34463447344834493455345634573458345934663467346834693477347834793488348934993555
22.35563557355835593566356735683569357735783579358835893599366636673668367736783679
23.36883689369937773778378837893799388838893899444544464447444844494455445644574458
24.44664467446844694478447944884489449945554556455745594566456745684569457745784579
25.45884589459946664667466846694677467846794688468946994777477847794788478947994888
26.48895555555655575558555955665567556855695577557855795588558955995666566756695677
27.56785679568856895699577757785779578958885889599966686669667866796688668966996779
28.678867896799688977787779788978998888888989999999


以下は、一般的なルールで10を作れない163個の数字の組み合わせ。

1.0000000100020003000400050006000700080009
2.0011001200130014001500160017001800220023
3.0024002600270029003300340035003600380039
4.0044004500470048004900560057005800590066
5.0067006800690077007800790088008900990111
6.0112011301140116011701220123013401440148
7.0157015801660167016801770178018802220233
8.0236026902770279029903330335033603380344
9.0345034803590366036903880389039904440445
10.0447044804570478047904890499056605670577
11.0588058905990666066706680677067806890699
12.0777077807880799088811111112111311221159
13.1169117711781179118813991444149916661667
14.1677169917772257344436693779399944444459
15.4477455848994999566857885799589966666667
16.6677677767786888689969997777778877897799
17.788879998899


以下は、一般的なルールでは10を作れないが、数字を連結させるルールでは10を作れる70個の数字の組み合わせ

1.0001001100120013001400150016001700180022
2.0023003300340044004500560066006700770078
3.0088008900990111011201220123013401440158
4.0166016701770178018802360279033603450369
5.0448045705891111111211221159117711781188
6.1444166617772257344436693779444444594477
7.6666666766776777777777887789779978888899

関連項目

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.