ナンブリックス (Numbrix) を、5 つのルールセット内蔵でブラウザに実装した。盤面を 1〜n で埋め、連続する数字は辺で接する。ラベルを剥がせば答えは格子グラフのハミルトン路で、数字はそれを歩いた順序を記録しているだけだ。ソルバー内蔵パズル第 47 弾。
デモ: https://sen.ltd/portfolio/numbrix/
リポジトリ: https://github.com/sen-ltd/numbrix
数字 1 個が盤面全体を市松に塗る
盤面をチェス盤のように 2 色に塗る。歩みは 1 歩ごとに必ず色が変わるから、v が入るマスの色は 1 が入るマスの色を v−1 回反転したものになる。つまり値のパリティとマスの色は大域的に固定されている。数字を 1 個どこかに印刷した瞬間、盤上の他の全部の数字が「自分は盤面のどちら半分に住むのか」を知る。
これは連作で測ってきた中でいちばん安くていちばん広い手がかりだ。8×8 のランダムな答えで測ると、生き残る「マス×数字」ペアはこうなる:
| 盤面 | 印刷した数字 |
pin の後 |
link の後 |
確定マス |
|---|---|---|---|---|
| 8×8 | 0 | 100.0% | 100.0% | 0.0% |
| 8×8 | 1 | 96.9% | 43.0% | 1.6% |
| 8×8 | 2 | 93.9% | 36.9% | 3.3% |
| 8×8 | 4 | 88.0% | 27.7% | 6.8% |
| 8×8 | 8 | 76.8% | 13.5% | 17.5% |
| 10×10 | 1 | 98.0% | 44.4% | 1.0% |
| 10×10 | 8 | 84.7% | 19.5% | 9.8% |
素の簿記(pin)は「印刷された数字を他の 63 マスから消す」で終わる。同じ手がかりを大域的な言明に変えるのは連鎖ルールのほうだ。そして 1 個目が半分以上を持っていき、2 個目以降は急に安くなる——市松は一度しか買えない。
しかもソルバーはこの定理をどこにもハードコードしていない。値の連鎖 1—2—…—n は木(パス)構造の制約ネットワークなので、その上での弧整合は厳密であり、市松は結論として勝手に落ちてくる。
系も 2 つあって、サンプルした 1,400 個の答えすべてで成立した:
- 値のパリティ ≡ マスの色(1,400/1,400)
- マス数が奇数なら歩みの両端は同じ色、偶数なら反対の色(奇数 600 盤・偶数 800 盤とも例外なし)
定規のルールは 1 ビットも稼がない
「連続する数字」のパズルなら、2 本目のルールは誰でも定規を思いつく。u から v へ歩くのはちょうど |v−u| 歩で、どんな歩みも格子距離には勝てない。だから u の候補マス全部から遠いマスは、u の周りの区間の数字をまるごと失う。健全だし、安いし、人間が実際に使っている手筋そのものだ。
そして link の後では証明可能に無価値だ。値の連鎖はパスだから弧整合は厳密で、link が残した候補はどれも「ある完全な歩み」に参加している。その歩み自身が距離条件の証人になっている。定規で証明できることは、連鎖がすでに証明し終えている。
主張を測定可能なままにするため、ruleSpan はラダーから外したうえでリポジトリに残してある。ランダム 160 盤での結果:
| 盤面 | 測定盤数 |
link の後に定規が消すビット |
pin だけの後に消すビット |
pin+定規の確定率 | pin+link の確定率 |
|---|---|---|---|---|---|
| 4×4 | 40 | 0 | 2,851 | 55.8% | 57.3% |
| 6×6 | 40 | 0 | 20,904 | 63.3% | 64.9% |
| 8×8 | 40 | 0 | 75,417 | 56.4% | 57.8% |
| 10×10 | 40 | 0 | 196,219 | 59.4% | 61.2% |
弱いルールではない。冗長なルールだ。単独で走らせれば連鎖とほぼ同じ量の仕事をする(確定率の差は 1.4〜1.8 ポイント)。それでも連鎖の後には 1 ビットも残っていない。
連鎖の後に残るのは「重ならない」という一点
弧整合が厳密に解いてしまう緩和問題は walk(自分の通った跡を踏んでよい歩み)だ。本物のパズルが walk より多く知っていることは全部「歩みが路である」——つまり相異なるマスを使う——ことに集約される。言い方は 2 通りある。
-
block(鳩の巣): 値 a…b は b−a+1 個の相異なるマスを要求する。候補マスの和集合がそれより小さければ盤面は死んでいるし、ちょうど同じ大きさならそのマス集合はブロックの持ち物なので他の値を全部失う。同じ議論をマス側から読むと(「a…b しか残っていないマスが b−a+1 個あるなら、他の全マスから a…b を消す」)逆向きの削除になる。Hall の条件の両側だ。 -
edge(次数): 数字を完全に忘れて、描かれた線だけを見る。全マスの路次数は 2、両端だけ 1。可能な辺が 2 本しかないマスはその 2 本を使うしかなく、確定した辺はラベルが構成上連続な連に貼り合わさり、連は閉路を作れず、生き残った辺は盤面を連結に保たねばならない。
下から段を積むとこうなる(確定マス率、ランダム開示):
| 盤面 | 開示率 | pin |
link |
block |
edge |
probe |
|---|---|---|---|---|---|---|
| 8×8 | 20% | 20.9% | 43.3% | 47.5% | 53.5% | 74.7% |
| 8×8 | 30% | 30.7% | 71.9% | 74.5% | 84.6% | 88.8% |
| 8×8 | 40% | 40.6% | 86.6% | 87.4% | 94.1% | 96.9% |
| 10×10 | 20% | 21.0% | 47.0% | 50.7% | 61.5% | 77.8% |
| 10×10 | 30% | 31.5% | 78.8% | 80.2% | 88.6% | 93.4% |
| 10×10 | 40% | 41.4% | 90.6% | 91.3% | 97.3% | 97.9% |
荷重を担う段は 1 本、あとの 3 本は加速器
積み上げの表と、上から 1 本抜く表は別のことを言う。両方見ないと嘘になる(連作で何度も踏んだ地雷だ)。probe を入れたフルラダーから 1 本ずつ抜くと:
| 10×10, 構成 | 確定マス | fixpoint が動いた盤 | pin scans | link scans | edge runs | probes |
|---|---|---|---|---|---|---|
| full | 84.9% | — | 496,439 | 471,796 | 4,484 | 1,763 |
| −pin | 84.9% | 0 / 12 | 0 | 556,574 | 5,250 | 1,763 |
| −link | 37.3% | 12 / 12 | 26,300 | 0 | 263 | 72 |
| −block | 84.9% | 1 / 12 | 714,182 | 687,840 | 6,726 | 2,015 |
| −edge | 84.9% | 1 / 12 | 703,965 | 660,469 | 0 | 2,520 |
| −probe | 74.3% | 9 / 12 | 11,300 | 11,300 | 113 | 0 |
到達距離を担っているのは link だけで、残りは速度だ。次数ルールを抜いても 12 盤中 11 盤で確定マスは 1 ビットも変わらない——ただし簿記の請求書が 42% 増え、probe の仮定回数が 43% 増える。線が無料で言っていたことを、probe が矛盾で導き直すからだ。積み上げの表で edge が稼いで見えた分は、実は「probe に払わせずに済んだ分」だった。
インクの使い方
ナンブリックスの手がかりは少ない。ただし作者が選んだ場合に限る。左は敵対的な最小集合(完答するまで開示 → 不要な given を全部取り戻す)、右は同じ盤でランダム順に開示して一意になるまでの枚数だ。差は盤が大きいほど開く:
| 盤面 | 敵対的(edge 級) |
マス比 | ランダム開示で一意になる枚数(中央値) | 比 |
|---|---|---|---|---|
| 4×4 | 3 | 18.8% | 31% | 1.7× |
| 6×6 | 6 | 16.7% | 22% | 1.3× |
| 8×8 | 10 | 15.6% | 30% | 1.9× |
| 10×10 | 15 | 15.0% | 49% | 3.3× |
敵対的な比率は盤が大きくなるほど下がる(10×10 なら 15% で足りる)のに、ランダムなインクは盤面の半分を要求する。probe に同じ仕事をさせれば 10×10 は 12 個まで落ちる。
ラダーの一番下は曲線ではなく壁だ。全単射だけで推論すると、マスが確定するのは「印刷されている」か「最後に残った 1 個」のときだけなので、pin は最初から全部印刷された盤しか完答できない。実測でも 4×4 で 16 個中 15 個、6×6 で 36 個中 35 個を毎回要求した。バンクに pin グレードが無いのはそういうパズルが存在しないからで、測定というより定理だ。
答えから第 2 解を読む
ナンブリックスの答えは歩みだから、手元の答えから別の答えを作る最安の手は古典的な 2-opt 反転だ。路上の 2 点を選び、そのマスが格子上でたまたま隣接していたら、その間の区間を逆向きに歩く。必要なのは窓の両端に 1 本ずつ辺があることと、窓の内側に印刷された数字が無いこと。全ペア走査は O(n²) で 1 ペアあたり O(1)——探索ゼロで答えから直読できる第 2 解だ。
| 盤面 | 非一意盤 | 反転 1 枚で説明 | 一意盤での誤検出 |
|---|---|---|---|
| 4×4 | 60 | 83.3% | 0 / 35 |
| 6×6 | 60 | 70.0% | 0 / 24 |
| 8×8 | 60 | 63.3% | 0 / 3 |
| 10×10 | 60 | 58.3% | — |
誤検出列が大きい盤で痩せているのは、曖昧さを出すためにストリームをわざと薄い開示にしたからだ。だから同じ仕事をフル強度でやるのは出荷バンクのほう: 64 盤すべてが一意で、1 枚も証明書を持たない。説明率が盤面サイズとともに落ちるのが正直な読み方で、大きい格子では「戻ってこない再ルーティング」が第 2 解になりうる。
反転より安い手はそもそも存在しない。1 マスだけが黙って数字を変えることは絶対にできない(その数字が 2 回現れ、別の数字が消える)。テストは 4×4 で全マス×全代替数字を網羅してこれを確認している。
探索せずに答えを引く — backbite
長方形には必ずハミルトン路がある(行ごとに折り返す boustrophedon = 蛇行路)。だからナンブリックスの答えは存在しないことがない。困るのは逆で、蛇行路は印刷するには規則的すぎるし、ランダムな歩みを盤面が埋まるまで棄却サンプリングするのは 5×5 を超えると絶望的だ。
そこで生成器は答えを引くのではなく答えの間を動く。backbite は、ハミルトン路の 2 つの端点のどちらかを選び、その端点の格子隣接マス u をランダムに選び、u が路上の次のマスでなければ辺 (端点, u) を足して「u に反対側から入っていた辺」を消す。結果は必ず同じ格子のハミルトン路になる。棄却なし、リスタートなし、失敗モードなし。
| 盤面 | 1 マスあたりの手数 | 採択率 | 答えの折れ数 | 200 回引いた中の相異なる答え |
|---|---|---|---|---|
| 10×10 | 0(蛇行路) | — | 18.0 | 1 |
| 10×10 | 1 | 69.8% | 33.1 | 200 |
| 10×10 | 4 | 71.7% | 50.9 | 200 |
| 10×10 | 16 | 71.8% | 55.9 | 200 |
| 10×10 | 60(出荷値) | 72.0% | 55.4 | 200 |
蛇行路の折れ数は 2(n−1) = 18 で、形はただ 1 つ。1 マス 16 手で折れ数は 3 倍になり、そこから先はもう動かない——200 回引いて 200 通り、採択率はどのサイズでもおよそ 7 割だった。
外部台帳
生エンジンはラダーと候補機構を一切共有しない。ただ歩き、完成した歩みをルール本文(validate)で採点するだけだ。印刷された数字を切ると国勢調査機になり、ここで突き合わせに歯が立つ——これらは公表された組合せ論であって、リポジトリが自分と静かに合意できる類の数ではない。
| 盤面 | 有向ハミルトン路(エンジン) | 公表値 |
|---|---|---|
| 3×3 | 40 | 40 — OEIS A096969 |
| 4×4 | 552 | 552 |
| 5×5 | 8,648 | 8,648 |
| 6×6 | 458,696 | 458,696 |
| 盤面 | ハミルトン閉路(エンジン) | 公表値 / 定理 |
|---|---|---|
| 4×4 | 6 | 6 — OEIS A003763 |
| 6×6 | 1,072 | 1,072 |
| 3×3, 5×5 | 0 | 0 — 定理(閉路は色を交互に踏むのでマス数が奇数だと不可能) |
そして参照ではなく証明した恒等式が 1 本。2×m のはしご格子では、歩みは列を自分のラング以外から出られないので両端から列を単調に掃き、折り返す列で一意に決まる。よって無向ハミルトン路は m² − m + 2 本。はしごのことを何も知らないエンジンは m = 2…8 で 4, 8, 14, 22, 32, 44, 58 を出した。ぴったりだ。
probe ⇔ 一意
パズル側では、候補伝播探索と生エンジンが「両方が完走した解数」で全件一致した。そして probe 完答 ⇔ 一意は 160 盤で両方向とも例外ゼロ:
| 盤面 | 盤数 | probe 完答 & 一意 | probe 停止 & 非一意 | 不一致 |
|---|---|---|---|---|
| 4×4 | 40 | 21 | 19 | 0 |
| 6×6 | 40 | 16 | 24 | 0 |
| 8×8 | 40 | 7 | 33 | 0 |
| 10×10 | 40 | 6 | 34 | 0 |
出荷した 64 盤はすべて、出荷前に両エンジンで一意性を再証明してある。
まとめ
- 数字 1 個が盤面全体を市松に塗る。8×8 で生き残る「マス×数字」ペアが 100% → 43.0%。2 個目は 36.9% にしかならない——市松は一度しか買えない。ソルバーは市松をハードコードせず、パス構造の弧整合の帰結として再発見する
- 系(1,400 盤で例外なし): 値のパリティ ≡ マスの色。マス数が奇数なら歩みの両端は同色、偶数なら異色
-
定規のルールは
linkの後に 1 ビットも稼がない(160 盤で 0 ビット)。弱いのではなく冗長。単独なら 2,851〜196,219 ビット消す強いルールで、確定率も連鎖の 1.4〜1.8 ポイント差まで迫る。パス上の弧整合が厳密だから、距離で証明できることは連鎖が証明済み - 連鎖の後に残るのは相異なるマスを使うことだけ。
block(Hall の両側)とedge(次数と連結)がその 2 通りの言い方 - 積み上げと ablation は別のことを言う: 到達距離を担うのは
linkだけ(−link で 84.9% → 37.3%)。edgeを抜いても 12 盤中 11 盤でビット単位不変だが、簿記が 42%・probe が 43% 増える——線が無料で言っていたことを probe が矛盾で買い直す - 敵対的なインクは 10×10 で 15 個(15%)、ランダム開示は 49% を要求(3.3 倍)。
pinは定理として n−1 個を要求するのでpinグレードのパズルは存在しない - 2-opt 反転証明書が非一意盤の 58〜83% を無探索で説明、誤検出 0。1 マスだけの静かな変更は網羅証明で不可能
- 生成は backbite: 棄却も失敗もなく答えの間を歩く。1 マス 16 手で 200 引き 200 通り、採択率 7 割
- 外部台帳: 有向ハミルトン路 40 / 552 / 8,648 / 458,696(A096969)、閉路 6 / 1,072(A003763)、奇数盤は 0(定理)、2×m は自前で証明した m²−m+2 を全項再現
- probe ⇔ 一意は 160 盤で両方向無例外
全 33 テスト。TypeScript、ランタイム依存ゼロ。
デモ: https://sen.ltd/portfolio/numbrix/
リポジトリ: https://github.com/sen-ltd/numbrix
