ケイブ(コラル / バッグとも呼ばれる)を、4 つのルールセット内蔵でブラウザに実装した。n×n のいくつかのマスを黒く塗る。白いマス——洞窟——は全体で 1 つの連結成分、塗った壁はすべて壁づたいに外周へ届き、数字は洞窟のマスに置かれ、上下左右に見える洞窟マスの数(自分込み、壁か盤端で視線が止まる)を示す。ソルバー内蔵パズル第 36 弾。
デモ: https://sen.ltd/portfolio/cave/
リポジトリ: https://github.com/sen-ltd/cave
このパズルを選んだのは、答えの空間そのものに名前が付いているからだ。
合法盤面は穴なしポリオミノ
数字を全部剥がして、完成盤がどんな形をしていられるかを考える。洞窟は連結、壁はすべて外周に届く——後者は「洞窟に囲まれて孤立した壁の塊(=穴)が存在しない」と同値だ。つまり合法な配置とは 穴のないポリオミノそのもの。そしてその境界——洞窟マスと壁(または盤外)を隔てる格子辺の集合——は、自己交差しない 1 本の閉曲線になる。
この対応は全単射だ。(n+1)×(n+1) 格子グラフの単純閉路 1 本につき、合法盤面がちょうど 1 つ。だから同じパズルが 2 つの名前で売られている——マスを塗ればケイブ、柵を描けばコラル。同じ対象だ。
数えて確かめた。手掛かりなしの合法盤面は 2×2 で 13、3×3 で 213、4×4 で 9,349。一方、ポリオミノのことなど何も知らない独立実装の単純閉路カウンタを (n+1)×(n+1) 格子に走らせると——13 / 213 / 9,349。OEIS の A140517(n×n 格子グラフの閉路数)と 3 点とも一致する。
書かれていないのに禁止されているパターン
市松の 2×2——対角に洞窟・洞窟、逆対角に壁・壁——はどのルールにも書かれていないが、合法盤面には決して現れない。対角の洞窟 2 マスを結ぶ洞窟の経路が閉曲線を作り、市松のどちらかの壁マスを外周から柵で閉じ込めてしまうからだ。境界ループの言葉で言えば、市松はループが自分に触れるピンチ点。連結性ルールの局所的な影であり、ソルバーではルール 1 段分の働きをする。
生成器: デジタル画像トポロジーの 3×3 スタンプ
穴なしポリオミノをどうサンプルするか。バックトラックで塗り方を探すのは、構造と喧嘩する方法だ。デジタル画像処理には既に正しい道具がある: 反転しても画像のトポロジーが変わらないセルを simple point(単純点)と呼び、3×3 の近傍だけで判定できる。
候補マスの周囲 8 マスを一周読む(盤外は壁扱い)。反転が安全なのは、ちょうど次のとき:
- 一周の色の変化がちょうど 2 回(洞窟の弧が 1 本、壁の弧が 1 本)
- 新しい色が上下左右のどれかに既にある
一周の隣接マスどうしは互いに 4 近傍なので、弧はそのまま連結成分になる。変化 2 回なら反転してもどちらの側も 1 つに保たれ、弧の条件がピンチ(市松 2×2)の発生を締め出す。
種セル 1 個から成長させ、あとはランダムな安全反転を数千回。途中経過のすべてが合法な配置で、大域的な連結性チェックは一度も走らず、バックトラックは存在すらしない。生成 1,500 盤の検証: 境界成分 1、ピンチ 0、V=E(閉曲線)——1,500/1,500。
ルールは 4 段
| レベル | ルール |
|---|---|
count |
手掛かりの算術を正確に: 数字 v は 1 + 4 方向の伸び (extent) に分解される。伸び e は「e マス洞窟、その先 1 マスが壁(または盤端)」を主張する。各方向の実行可能な伸び集合を和のビットマスクで畳み込み、全実行可能解が一致するマスだけ確定する |
corner |
2×2 の 16 通りのうち市松の 2 通りだけが死ぬ。3 マス確定時のみ効く |
bridge |
2 つの連結性ルールを局所化、関節点 DFS を 1 回ずつ: 洞窟マスは(洞窟∪未確定)の中で相互到達を保ち、壁は盤外を表す仮想ノードから(壁∪未確定)で到達可能を保つ。封じられたマスは反対の色、カットバーテックスはその色に確定 |
probe |
1 マスに色を仮置きし、下位ルールで矛盾したら棄却 |
実測 — incremental と ablation、今回は最も鮮やかに割れた
300 盤/サイズの生の生成ストリーム(洞窟マスの 85% を開示、一意性でも難易度でも無選別——測りたい性質でサンプルを歪めないため)で、推測なしの fixpoint だけで完成する率:
| 盤面 | count | +corner | +bridge | +probe | ストリーム中の一意解率 |
|---|---|---|---|---|---|
| 6×6 | 16.0% | 44.0% | 72.7% | 73.3% | 73.3% |
| 8×8 | 6.3% | 29.0% | 55.3% | 55.7% | 55.7% |
| 10×10 | 2.3% | 23.0% | 52.0% | 53.0% | 53.0% |
incremental の表では corner は +21〜28pt の準主役だ。ところが ablation(全ラダーから 1 ルールだけ抜く)を回すと:
| 盤面 | full | −count | −corner | −bridge |
|---|---|---|---|---|
| 6×6 | 73.3% | 0.0% | 73.3% | 44.0% |
| 8×8 | 55.7% | 0.0% | 55.7% | 29.3% |
| 10×10 | 53.0% | 0.0% | 53.0% | 23.7% |
−corner は全サイズで損失 0.0pt。1 盤も落ちない。corner は連結性の影で、連結性そのもの(bridge)が部屋に入った瞬間、影は消える。逆に −count は全サイズ 0.0%——数字を読む唯一のルールを抜けば、何も始まらない。「冗長と無用は違う」はこのシリーズで 4 回連続の観測になった: corner はバンクの難易度グレードを 1 段ちゃんと定義するし、人間が実際に目で見つけるパターンでもある。
probe の解決率 = 一意解率、今回も
3 サイズすべてで probe 列は一意解率と完全一致した。健全な fixpoint は複数解が食い違うマスを確定できないから一意解率は理論上の天井で、ラダーはその天井に張り付いている。
ケイブの曖昧さは 1 マス反転に棲む
ケイブも乱数開示には飢えている——手掛かりは洞窟マスにしか置けないので、壁は永遠に自由マスのままだ。だが飢え方がイン・ヤンと正反対だった。
反転しても盤面が合法なままで、どの手掛かりの数字も変わらないマスを silent flip と呼ぶ。silent flip が 1 個でも残っていればそれは無料の第 2 解なので、P(一意) ≤ P(silent flip なし)。10×10、各点 150 盤:
| 開示率 | 一意 | no-silent-flip 天井 | bridge 解決 | count 解決 |
|---|---|---|---|---|
| 0.50 | 1.3% | 3.3% | 1.3% | 0.0% |
| 0.60 | 6.0% | 12.0% | 6.0% | 0.0% |
| 0.70 | 20.7% | 26.0% | 20.7% | 0.0% |
| 0.80 | 38.0% | 47.3% | 37.3% | 2.0% |
| 0.90 | 65.3% | 72.7% | 64.7% | 1.3% |
| 1.00 | 100.0% | 100.0% | 100.0% | 2.0% |
イン・ヤンでは実測の一意率が flip 天井のはるか下を這っていた——曖昧さが曲線の複数マス引き直しに棲んでいたからだ。ケイブの一意率は天井にほぼ張り付いて登る。配置としては 10×10 平均 50 マスも反転可能(空間はゆるゆる)なのに、視線の算術がそのほとんどを黙らせ、残った曖昧さはほぼすべて 1 マスの silent flip だ。
2 つの列は二度見の価値がある。洞窟マスを全部開示(1.00)すると盤面は必ず一意になる——のに count 単独の解決率は 2% のまま。数字は答えを一意に釘付けにするが、そこへ到達することはできない。洞窟が 1 部屋であること、壁に出口があることを知っているのは連結性ルールだけだ。そして連結性が伝播に入ると一意性証明はほぼ探索でなくなる: 10×10 で bridge の分岐回数は中央値 0(平均 1.0)。connectivity を持たないレベルの探索は、クルーされない壁の自由マスとともに 6×6 の時点で既に爆発を始めている。
敵対的に間引いたバンクの盤面は 10×10 を中央値 23〜27 手掛かりで一意にする——乱数開示がコイントス程度の確率を得るのに要する予算の半分だ。
検証
すべての主張を 2 つの独立な経路で数える。ひとつは 4 レベル各々で伝播しながら探索する数え上げ。もうひとつはルールのコードを一切共有しない総当たり——枝刈りは定義そのものの 3 つ(手掛かりの min/max、洞窟の到達可能性、壁の外周到達可能性)だけ、葉では独立バリデータが最終判定する。総当たりが届く全盤面・全レベルで解数一致: 400/400。
厳密なアンカー: 手掛かりなしの 2×2 / 3×3 / 4×4 は 13 / 213 / 9,349 盤、独立の格子閉路カウンタと 3 点一致(A140517)。境界ループ定理は生成器の出力だけでなく(それは循環論法になる)、4×4 までの全合法盤面で全数検証。3×3 スタンプが受理した反転はすべて独立バリデータで再検査——壊れた盤面は一度も出ない。全 25 テスト。
遊び方
デモの Hint ボタンは選択中のレベルで最初に確定するマスを 1 個ずつ埋める。ルールセレクタがそのまま難易度で、バンクは「そのレベルで初めて推測なしに解ける」盤面だけを出す。洞窟の境界は紫でライブ描画される——解に近づくにつれ、それが 1 本の柵に閉じていくのが見える。閉じた瞬間、あなたはコラルも解いている。
次回もソルバー内蔵パズルの予定。
SEN 合同会社 — ソフトウェア開発の実験と実装を公開しています。
他のポートフォリオ: https://sen.ltd/portfolio/
