ぬりみさきを、4 つのルールセット内蔵でブラウザに実装した。n×n の盤面のいくつかのマスを黒く塗る。白マスは全体でひとつながり、どの 2×2 も単色(全白・全黒)にならない。白マスのうち白の隣接マスがちょうど 1 つのものを岬と呼ぶ——そして丸が印刷されたマスは岬であり、岬は必ず丸マスである(同値)。丸の中の数字は、岬からその唯一の白隣接方向へまっすぐ延びる白の連続マス数(岬自身を含む)。ソルバー内蔵パズル第 38 弾。
デモ: https://sen.ltd/portfolio/nurimisaki/
リポジトリ: https://github.com/sen-ltd/nurimisaki
このパズルを選んだ理由は 2 つある。どちらも「同値(iff)」という一語に住んでいる。
余白がヒントである
丸ルールが同値だということは、何も印刷されていないマスもヒントだということだ。空白マスは「ここは岬ではない」と約束している: そのマスが白になるなら、白い隣接マスは 2 つ以上なければならない。パズルの情報の一部が、印刷された記号ではなく印刷されなかった場所に書かれている。連作で初めて、この「余白の情報量」を数字にできた(後述: 6×6 で一意率 12/60 → 2/60、解数中央値 3 倍)。
ヒントの位置は作者が選べない
連作のどの兄弟パズルでも、作者は盤面を作ってからヒントをどこに置くか選ぶ。ぬりみさきでは答えがヒントの位置を強制する: 丸は完成盤の岬の位置に、過不足なく置かれる。ヒントは足せないし動かせない——できるのは数字を消すことだけ。つまり盤面が自分でヒント予算を配る。その予算は 100 マスあたり岬 15 個前後で、サイズに依らずほぼ一定。だが盤面が要求する情報量は n² で伸びる。この構造的な飢えが、以下の全ての表に貫通して現れる。
合法盤面の構造 — 細い白、混ざり続ける窓
数字を剥がした合法盤面(白ひとつながり + 両色 2×2 禁止)を全数で数えると、2×2 盤で 12、3×3 で 103、4×4 で 2,286。白は 2×2 を含めない「細い」ポリオミノでありながら、全黒 2×2 も禁止だからどの 2×2 窓にも白が届いていなければならない——痩せていて、しかも偏在できない。岬の数のヒストグラムも全数で取れる: 4×4 の 2,286 盤中、岬 0 個が 14、1 個が 48、最頻は 3 個(936)。岬 0 の盤面とは白がループを組むか孤立 1 マスの場合で、3×3 ではちょうど 2 つ——中央の 1 白マスと、それを囲むリングだ。この 2 つは「丸のないパズル」の全解でもある(丸なし = 全マスで岬禁止)。
ルールは 4 段
| レベル | ルール |
|---|---|
cape |
同値の両側。丸マスについて「どの隣接マスが唯一の白か」を方向ごとに列挙し(数字があれば走路の白と終端の黒まで含めて)、生き残った全方向が一致する帰結だけ確定。空白マスは白隣接を 2 つ確保できなければ黒 |
window |
単色 2×2 禁止(両色とも): 3 マス同色が決まれば 4 マス目は逆色。兄弟パズルでは 2×2 パターンは連結性の「影」として導出されたが、ここでは明文ルール |
bridge |
白の連結性を局所化する関節点 DFS 1 本: 白領域から遮断された自由マスは白になれず(ポケット)、白同士の唯一の通路は白確定(ブリッジ)。黒には連結義務がなく、このルールに黒側は存在しない |
probe |
1 マスに色を仮置きし、下位ルールを fixpoint まで回して矛盾したら棄却 |
実測 — 法則の復活と、一意率の崖
300 盤/サイズの生の生成ストリーム(ランダム合法盤面 + 強制された丸 + 全岬に数字。数字しかダイヤルがないので密度 1.0 が自然な基準線)。推測なしの fixpoint だけで完成する率:
| 盤面 | cape | +window | +bridge | +probe | ストリーム中の一意解率 |
|---|---|---|---|---|---|
| 6×6 | 1.0% | 4.0% | 14.0% | 24.3% | 24.3% |
| 8×8 | 0.3% | 0.3% | 3.0% | 7.0% | 7.0% |
| 10×10 | 0.0% | 0.0% | 0.7% | 1.3% | 1.3% |
見るべき点が 2 つ。まず probe 列 = 一意解率、全サイズで一致。前回クロットで連作史上初めて破れた「probe 解決率 = 一意解率」の法則が、ぬりみさきでは復活した。クロットの曖昧さは複数マスのブロック組み替えが単一マスの仮置きから見えないことで生じたが、ぬりみさきの窓ルールと連結性はその種の重ね合わせを 1 セル probe の視界内に引きずり出すらしい。
そして一意率そのものが崖だ。印刷できる数字を全部印刷しても、10×10 で一意なのは 1.3%。岬の平均は 10×10 で 14.4 個、数字の平均値は 3.0(サイズ非依存)——1 つの数字が語れるのは高々数マスで、n² マスを釘付けにするには予算が桁で足りない。兄弟たちは開示密度を上げれば 100% に届いた。ぬりみさきには上げるダイヤルがない。
Ablation — 冗長性ゼロ、連作初
全ラダーから 1 ルールずつ抜く。最終列は印刷ルールを全部残したまま、空白マスの「岬なし」約束だけを伝播から外した場合:
| 盤面 | full | −cape | −window | −bridge | −余白の約束 |
|---|---|---|---|---|---|
| 6×6 | 24.3% | 0.0% | 6.0% | 9.3% | 7.7% |
| 8×8 | 7.0% | 0.0% | 0.3% | 0.7% | 1.7% |
| 10×10 | 1.3% | 0.0% | 0.0% | 0.0% | 0.0% |
−cape の全崩壊はケイブの −count と同じ「数字を読む唯一のルール」パターン。だが注目は 10×10 の行だ: どの 1 ルールを抜いても 0.0%。クロットは 4 段が同じ定理の影で下 3 段どれを抜いても無傷、ケイブは corner が bridge の完全な影だった。ぬりみさきの 4 段は 4 つの別々の定理で、盤面が情報に飢えすぎているため全段が同時に急所になる。redundant-but-not-useless を 5 例集めた連作が、初めて redundancy そのものが存在しないパズルに当たった。
余白の列は連作初の測定だ。fixpoint への寄与(6×6 で 24.3% → 7.7%)だけでなく、意味論ごと変えて裏を取った: 「丸なしマスにも岬を許す」変種ルールで同じ 60 盤の解を数え直すと、一意盤面は 12/60 から 2/60 に落ち、解数の中央値は 3 倍になる。ぬりみさきの情報のおよそ半分は、余白に書かれている。
数字のダイヤルはどこまで回しても足りない
8×8、各点 150 盤で数字の保持率だけを振る:
| 密度 | 一意 | probe 解決 | bridge 解決 | 平均数字数 |
|---|---|---|---|---|
| 0.00 | 0.0% | 0.0% | 0.0% | 0.0 |
| 0.25 | 0.0% | 0.0% | 0.0% | 2.4 |
| 0.50 | 1.3% | 1.3% | 0.0% | 4.4 |
| 0.75 | 4.7% | 4.7% | 1.3% | 7.2 |
| 1.00 | 5.3% | 5.3% | 3.3% | 9.3 |
どの密度でも probe = 一意が成立し続け、そして 1.00 まで回しても 5.3% で頭打ち。丸だけ(密度 0)で一意になった 8×8 は 150 盤中 0——ただし小盤では起きる: 出荷 bank の 5×5 probe 級は中央値で丸 4 個中、数字 1 個しか残さない。岬の配置図形そのものが答えをほぼ言い当てる盤面が実在する。
Bank — フル開示から間引けないので、釣る
兄弟パズルの bank 生成は「フル開示から間引く」だった。ぬりみさきのフル開示は最初から一意ですらないことが多い(テスト fixture に固定した: 全岬に数字を付けても 4 解・6 解の手描き盤面)。だから生成器は生ストリームから稀な一意盤面を釣り上げ、そこから数字を敵対的に削る。10×10 probe 級は中央値で丸 17 個・残る数字 6 個。
そして grade バケット自体が盤面に配られる: 8×8 以上では cape 級・window 級の盤面が数千 attempt で 0 枚——存在しない。下位ルールだけで完成する盤面は、予算が細る大盤では作れないのだ。UI の Rules メニューは、選んだサイズが産めない難易度をグレーアウトする。一意性の証明に要する探索は、全ラダー伝播で 10×10 中央値 6 分岐。連結性を持たない下位ルールの探索は 6×6 で既に爆発する(cape 単独: 平均 139.5 分岐)。
検証
- 解数の突き合わせ: ラダーとコードを共有しない総当たり(自由マスを行優先 DFS、枝刈りは明文ルールの言い換えのみ、葉は独立バリデータ採点)と、4 レベル各々の伝播付き探索が、総当たりの届く全盤面で一致——560/560 (盤面, レベル) ペア。余白の約束を外した変種エンジン同士でも 120/120。
- 全数アンカー: 丸なし 2×2 / 3×3 / 4×4 盤を素朴ループで全列挙——12 / 103 / 2,286 盤、うち岬なし 4 / 2 / 14。岬なし盤面は「丸のないパズル」の全解と一致し、全エンジンが同じ数を返す。
- フル開示 ≠ 一意: 全岬数字付きで 4 解・6 解の fixture を総当たりで認定し、テストに固定。可解性から一意性を推定する箇所はなく、bank の全盤面は探索エンジンで一意性を再確認済み。
全 40 テスト。npm test で回る。
まとめ
- 丸ルールが同値なので、空白マスも「岬ではない」というヒントとして伝播に参加する。その寄与は 6×6 の fixpoint で 16.6pt、変種意味論の解数で中央値 3 倍——情報の約半分が余白。
- ヒント位置は答えが強制し、予算は 100 マスあたり岬 15 個で頭打ち。全数字でも 10×10 の一意率 1.3% という、連作で最も飢えたパズル。
- クロットで破れた probe = 一意の法則は復活。一方で ablation の冗長性は連作初のゼロ——10×10 ではどの 1 ルールを抜いても 0.0%。
- 8×8 以上に cape 級・window 級の盤面は存在しない。難易度のラインナップまで盤面が決める。
TypeScript + Vite、ランタイム依存なし。コードは全部公開している。
