前回に引き続きナンプレ解読プログラム GET81 (仮) についてお話させていただきます。
機械解きをするにしても作った本人が楽しめなければ何もなりません。ただ解くだけなら優秀なプログラムが世の中にはたくさんありますから。
そして、問題の中には、賭ケグルイの「扉の塔」のように作者の意図やメッセージが込められているものもあります。視覚的に美しいもの、近道をしようとすると大失敗するもの、難易度が高いらしいが、案外簡単な方法で解けてしまうものなど様々です。
それらを機械解きを通じて紐解くのもナンプレの醍醐味です。
ネットで作品(問題)を提供してくださるすべての作者様にはこの場を借りてお礼申し上げます。
それでは、Get81の中身についてですが、アマチュアのだらだらしたコードを見せられても不快なだけで、ましてやプログラムに興味のない方はちんぷんかんぷんなので、おおまかに言葉で記すことにします。
get81.uws
データ入力(一列入力 / 一括入力 / スキャン /ソース )
基本モード
ひらめきモード(トリプル、ダブル)
ニコニコモード
ギャンブルモード
パワーモード
ハイパワーモード(AIモード)
と、大きく分けて解読は6つのモードに分かれます。各モードはオプションでON / OFF できるものもあり、難問ほど下のモードでの対応になります。
各モードの説明
基本モード
一般的に人が解くように行、列、BOXを参照しながら、候補を絞っていきます。Get81では基本的に候補を足していくのではなく、候補を削っていって最終的にひとつになった時が確定とします。つまり、空欄には当初1~9が割り当てられ、状況に応じて減らしていきます。
基本モードでは次の技を搭載しています。キジはナンプレ自体をあまり知らないので、技の呼び方がいい加減かもしれません。
①縦横BOXに同数が入らないよう候補を削る
②縦横方向へ他のマスに入っていない数字があれば確定
③ボックス内で他のマスに入っていない数字があれば確定
④ヨコ方向へダブル文字を削除(25 25 があるときそれ以外のマスから2,5を削除)
⑤タテ方向へダブル文字を削除( 〃 )
⑥BOX内でダブル文字を削除( 〃 )
⑦BOX内で2種類が同じ2マスの時、私たちの指定席に
⑧横方向へ2種類が同じ2マスの時、私たちの指定席に
⑨縦方向へ2種類が同じ2マスの時、私たちの指定席に
⑩Box確定、横行追い出し 団体指定席なので、ここには居れません
⑪Box確定、縦列追い出し 団体指定席なので、ここには居れません
⑫横行確定、BOX追い出し 団体指定席なので、ここには居れません
⑬縦列確定、BOX追い出し 団体指定席なので、ここには居れません
⑭ X-WING 横
⑮ X-WING 縦
と、まあこの程度。Procedureにしているので、追加可能ですが、これ以上作っても生産性に乏しいので止めました。と言うのはx-wingを作る前からフィンランドの数学博士が作った所謂「世界一」問題や東大の渡辺教授がスーパーコンピュータで作った問題は解けていたのですが、技を増やすことによりもっと劇的なことが起こると思いx-wing追加にチャレンジしました。
しかし、結果はどうでしょう。いちいち適用されないにもかかわらずチェックしに行くので逆に解答時間が長くなる始末。もっと機械解きならではのいい手はないものかと考え出したのが、下のニコニコモード。
ひらめきモード
これは、人が解くときでも賛否はともかく使われる方はいらっしゃるのではないでしょうか?
同数の候補が同数のマスにある時、入れ子にして解いていく所謂仮置き法です。初級中級問題では非常に効果的で、基本モードで解けないときはひらめきモードで何とかなるものが多くあります。
ニコニコモード
コロナ禍で作ったもので、キジは一番気に入っている最新モードです。渡辺氏の問題や宇宙二位の問題(真相は定かではない)などは、このモードで簡単に解けてしまいます。
これは麻雀の役七対子(チートイツ)にちなんでつけた名前ですが、数字の選択肢が2マスもしくは1マスの候補が2数字に着目します。
たとえば、
2つのマスにそれぞれ候補2種が残ったとき 例 (0,0 ) = 2,4 (1,0) = 2,4
行または列に2か所しか存在しない数字があるとき
連鎖法則により任意の数字が2マスに限定されるとき (下図 8は水色マスのどちらか)
こういった状況にある、マスと候補数字をピックアップします。数字がまだ削れていない状態では人の目で探すのは大変ですが、プログラムで抽出するのはあっという間です。しかも、難問でさえ2択はそこそこあります。
そして、抽出したペアーにそれぞれ数字を当てはめていき、前者に矛盾が生じれば後者が確定、後者に矛盾が生じれば遡って前者が確定ということになります。また同時に、矛盾が出た数字は候補から外れるので一石二鳥です。そうして、確定ないし候補削りを繰り返しながら、やがて全マス確定になるという寸法です。
ただ、恐ろしいことにフィンランドの世界一問題は状況が違っていました。ペアーの候補は10以上あれど、確定もしなければ矛盾も発生しません。これは、偶然ではなくおそらく計算されたものでしょう。作者の「2択で解こうなんて世界一はそんなに甘いもんじゃないよ」という声が聞こえてきたような気がしました。 氏の作る問題は「世界一」に限らず、他の問題も見事に二択外しで作成されているようです。
ギャンブルモード
これはニコニコモードの応用ですが、そもそも先にできたのはこちらのギャンブルモードです。
機械解きのアイデアに行き詰っていた時、ふと世界一の問題はいくつのヒントを与えられたら一般問題に変わるのだろうと考えました。
たとえば、2択のマスが4つ確定すれば、解きやすくなるのではないか?その仮定をもとに、ここからは、丁半博打です。
4つのツボに2択を入れて、2X2X2X2 = 16通りを試す。その中に必ずあたりがあるからその状況では、基本技だけで正解にたどり着けるのか?
答えは否。 恐るべし 徹底した2択外し。世界一たる所以が少しわかった気がしました。
あらゆるナンプレ問題がそろったナンプレのデパートこと「いちごナンプレ研究所」で見た記事に、難問を解くとき2択には目もくれず・・・というのを目にした記憶があるのですが、上級者と出題者の戦いは心理戦にまで及ぶのですね。
ギャンブルモードは、徒労に終わったかと思いきや、朗報もありました。 Youtubeで知った難問がこのモードで解けました。この問題も不思議な問題で、ニコニコ候補は山ほど発見できるのに、矛盾や確定が発生せず、ニコニコモードで山は動きません。しかし、2択を束になってかかっていくことで、なんとか解読できました。作者に了承を受けたわけでないので、問題をここに記載することはできませんが、Youtubeから
「Puzzle8 You won't want to play Sudoku again」で検索をかけていただければ出てきます。
パワーモード
これはもう総当たりです。どこに正解が埋まっているかここ掘れワンワンの世界。ここで、大事なのは、では嗅覚はどうするか。つまり、どこからサーチしていくのが順当か?はじめは、左上から右下に降りて行くようにしていましたが、それでは無機質すぎる。なるほど、正解が左上に埋まっていた場合は、いち早くにたどり着けるが、右下に正解が埋まっている場合はどうだ。たとえ結果的に時間がかかろうが、検索順には意味を持たせねばということで、3つの方法が候補にあがりました。
1つ目は、検索効率を考えると候補が少ないものから検索すれば時間的には合理的ではないか?
2つ目は、いや難問ほど2択を外すという経験からBOX内の確定数字が多いところに仮置きしてやるとあとは雪崩式に解けていくのではないか?
3つ目は、いやいや確定数字の少ないところを仮置きで埋めれば、全体的に解けていくのではないか?
実際のところパワーモードでは仮置き1か所だけなので、速めの機械で攻略すれば時間的には気になりません。つぎのハイパワーモードでは、2か所仮置きするので、検索順によってあたりを引き当てる時間にかなり差が出てきます。
ハイパワーモード
これはもう、破れかぶれの力技です。ここまでのモードで解けなかった場合、これまでの候補から2マス選んで仮置きします。オプションとしては、先ほどの検索順と時間的な関係からあまりに候補が多いマスはスキップさせることができます。いつもは、候補が5つ以上あるマスはスキップするようにしていますが、この設定で何とかなっています。最後までやって解けなかった問題はまだないのですが、候補の多い2マスに正解がありそのマスが検索の最後に回った場合、検索時間は1時間を超えると思います。
結局このモードは、CPU等の性能と検索運に依存するため、どの問題が何分で解けたというのはナンセンスなのですが、世界一で1分ちょっと、世界二で220秒かかっています。目標としてはすべての問題3分以内に解けてほしいですが、そのためには技をもっと追加しハイパワーモードに入る前にいかに候補を絞り込むかということでしょうが、キジ的にはもうこれ以上時間はかけないつもりです。
総括として、ハイパワーモードの仮置き2か所まで行けば、たいていの問題は解けるのではないでしょうか。
そこで、偉い人に解いていただきたいのですが、
「すべてのナンプレ問題は特定の2マスの答えを与えれば、基本技だけで解読できてしまう」の真偽を
あっ 最後にAIモード書き忘れてたので追記を
これははっきり言ってインチキモードです。当初のプログラムでは同じ問題を何回解いても所要時間が似たり寄ったり。中で同じプロセスを踏むので当たり前なんですが。それで、AIモードと称して、一度ハイパワーまで行って苦労した問題は、解き方を記録するようにしたんです。解き方というより、あたりマスを記憶していていきなりそこを探すという代物です。だからいかに難問であっても一度解いた問題は10秒程度で解けるようになっているという仕掛けです。 誰得?というか桃太郎に見せて自慢するときのためです
