
【AIとつくったペンシルパズル】ライアースイーパー
ChatGPTと新しいペンシルパズルを作ることに挑戦してみました!
前回の挑戦はこちら。
この時は、ChatGPTがすべてを作りました。今回は私と一緒にルールやコードを作っています。
さて、今回は、ChatGPT o1-previewと一緒にルールや問題を生成したパズルである、「ライアースイーパー」というパズルをご紹介します。(シンプルなルールなので、全く同じパズルをすでに考案している人がいるかもしれません。)
この記事は、パズルの記事でもあり、ChatGPT o1-previewの記事でもあります。
ちなみに、サムネ画像はChatGPT 4oが生成したものです。
パズルの概要
ルール
パズルは N×N のグリッドで構成されています。
すべてのマスにはヒントとして数字が書かれています。
一部のマスを黒く塗りつぶします。他のマスはそのままにします。
ヒントの数字は、そのマスに隣接する8マス(縦・横・斜め)に含まれる黒マスの数を示します。ただし、黒く塗りつぶしたマスのヒントは無視してかまいません。
黒マスが2×2のブロックを作ってはいけません。
プレイヤーの目的は、黒く塗りつぶした数字以外の、残されたすべての数字が正しく周囲の黒マスの数を示すようにすることです。
例題

左が問題、右が答えです。
この例題だと、左上の「3」が白マスだと仮定すると、その周囲すべてが黒マスになります。すると、右列の1は両方とも矛盾するため黒マスになり、2×2の黒マスのブロックができてしまいます。つまり、左上の「3」が白マスという仮定は間違いで、これは本当は黒マスであることがわかります。

次に、左下の「3」が白マスだと仮定すると、その周囲すべてが黒マスになります。すると、上の「2」の矛盾するため黒マスになり、2×2の黒マスのブロックができてしまいます。つまり、左下の「3」が白マスという仮定は間違いで、これは本当は黒マスであることがわかります。

さらに、左の「2」のマスが黒マスだと仮定すると、下の「1」は矛盾するため黒マスになり、真ん中の「3」も矛盾するため黒マスになります。これでは2×2の黒マスのブロックができてしまうため、左の「2」のマスが黒マスという仮定は間違いで、これは本当は白マスであることがわかります。

すると、このマスの周囲にはすでに黒マスが2個あるため、それ以外のマスは白マスであることがわかります。

あとは簡単に解くことができます。
今回の問題
サイズで難易度を調整しやすいので、4問載せます。
4問目は私では手も足も出ません。プログラマなら解けるかも。
問1

問2

問3

問4

挑戦してみる?
ChatGPT o1-preview への指示文
このパズルの作成は次のプロンプトからスタートしました。
Prompt
セルを塗りつぶすタイプの新しいペンシルパズルのルールを考えてください。そのルールに従って問題を生成するpythonコードと、問題を解くPythonコードを書いてください。問題を解くPythonコードでは、解が複数ないかどうかも確認してください。 更に、その2つを組み合わせて、解が一つに定まらない場合問題を部分的に修正し、解が一つになる問題を生成し、問題と解を出力するPythonコードを書いてください。これらのコードは現実的な時間で実行できるように工夫してください。
ポイント
一度のプロンプトに要求を盛り込む
ChatGPT 4oでは複数回のやり取りを前提としたプロンプトにして、まずはルールだけを考えさせるのが良いと思いますが、ChatGPT o1-previewの場合、一度のプロンプトに要求を盛り込み、GPTに思考させるのが良いと思います。
直接的に問題を生成させずにpythonを経由する
問題と解答については、コードを経由することを強くお勧めします。これにより、文章としてそれっぽい出力ではなく、きちんとルール上破綻のない問題を生成することができます。
(ただし、ChatGPT o1-miniで試した際は、ルールそのものに破綻がある場合があり、いつまで経っても終了しないコードを出力したことがありましたので、注意が必要です)
今回はChatGPTが最初に作ったルールだと、とてもつまらない作品でした。下記がChatGPTが最初に作った作品です。
ChatGPTが生成したパズルのルール:「アイソレート(Isolate)」
セルの塗りつぶし:一部のマスを黒く塗りつぶします。他のマスは白のままにします。
数字の意味:数字が書かれているマスは、そのマスに隣接する(縦・横・斜め)黒マスの数を示します。
黒マスの配置:黒マス同士は互いに隣接してはいけません(斜めも含む)。
白マスの連結:全ての白マスは縦横につながっていなければなりません。
この方向で進むと、ルール3と4がなければ既存のパズル(ボンバーパズル)ですし、このルールを追加することでむしろつまらなくなってしまっています。そこで、私もアイデアを追加しました。
以下は、実際のプロンプトからの抜粋です。実際のプロンプトではこれらに加えて、コードのエラー修正依頼や、こちらで直したコードを貼り付けたりもしています。
このルールでは面白い問題にならなさそうです。以下のルールを新たに追加してください。 ・数字の書かれたマスを塗りつぶすこともできる。その場合、その数字の条件は満たさなくてよい。
ルールを変更したことで、ヒントの数を減らすのではなく逆にすべてのマスをヒントで埋める方が面白そうです。解が唯一になるように気を付けながら、すべてのマスをヒントで埋めてください。この際、黒く塗りつぶすマスについてはうそのヒントでもよいことに気を付けてください。
「白マスの連結:全ての白マスは縦横につながっていなければなりません。」のルールはなくしてよい
偽のヒント数字を生成する際に、真のヒント数字の出現頻度に合わせた確率で偽のヒント数字を生成するように修正してください
ルール「黒マスの配置:黒マス同士は互いに隣接してはいけません(斜めも含む)」をなくして、代わりに ルール「黒マスの配置:黒マスが2×2のブロックを作ってはいけません」 にしてください
その結果、今回のルールのパズルになり、問題生成プログラムも得られました。
最後に、人間である私が考えたオリジナルパズルを紹介
ちなみに、人間である私が考えたオリジナルパズルはこちらです。高校生くらいの時に作ったルールなんですよね。AIにアイデア負けしていなければよいのですが…。
ライアースイーパーのすべての問題はこちらから。今後も問題を出していきます。
ブラウザから遊べるようにしました。