0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

うそわん — 本当の数字をもう 1 つ書き足すと、盤の答えが 2 つになることがある

0
Posted at

うそわん(Usowan)を 5 段のソルバー内蔵でブラウザに実装した。ルールは「塗ったマスどうしは辺で接しない」「白マスはひとつながり」「数字は上下左右の塗りマスの個数」——ただし太線で囲まれた各領域に、うそが 1 つだけ混ざっている。どれがうそかは書かれていない。この一文のせいで、このジャンルでは数字が単調な制約ではなくなる。領域のルールが「うちの数字のうち 1 つだけが間違い」なので、数字を 1 つ足すことはうそ候補を 1 つ足すことでもある。出荷盤の空白の白マスに正しい数字を書き足す実験を全 2,391 通りやると、55 回は盤の答えが 2 つに増えた(10×10 では 36 枚中 20 枚に、そういうマスが少なくとも 1 つある)。ほかに測ったもの:中央のマスに 4 と書いた数字は必ずうそ(全 1,646,096 通りの 6×6 答えで share が厳密に 0%。連結条項を外すと 1.47% に戻るので、犯人は「白はひとつながり」の側)。答えの総数はブロークンプロファイル DP で厳密に数え、8×8 で 118,930,018,898、16×16 で 2.18×10^53(146,604 状態、55.5 秒)。連結条項を外すと OEIS A006506 に退化して全項一致するが、本体の数列は OEIS に無い。うそを名指しすれば盤は「普通のパズル」に戻るので、8×8 盤は中央値 13,824 個の普通のパズルの重ね合わせ。梯子は cell → count → region → connect → probe の 5 段。全 46 テスト。ソルバー内蔵パズル第 67 弾。

デモ: https://sen.ltd/portfolio/usowan/
リポジトリ: https://github.com/sen-ltd/usowan

Usowan

ルール

**うそわん(Usowan)**はニコリのパズル。

  • いくつかのマスを塗る
  • 塗ったマスどうしは辺で接してはいけない
  • 白マスは全部ひとつながり(辺でつながっていること)
  • 数字はそのマスの上下左右にある塗りマスの個数。数字マス自身は塗らない
  • ただし太線で囲まれた各領域の中に、間違っている数字がちょうど 1 つある

実装前にニコリの公式ページを一次資料として読み、Cross+A の記述と突き合わせた。

The number shows how many colored cells are next to a cell, vertically and horizontally. However, in each rectangle bordered by bold lines, there is one (and only one) wrong number.

この "one (and only one) wrong number" が以下ずっと主役になる。つまり、うそわんの数字は「私の周りの塗りは v 個だ」という文ではない。「私の周りの塗りは v 個だ。ただし私が領域のうそつきなら、v 個以外**だ」**という 2 つの文の重ね合わせで、後半もれっきとした情報だ。

出荷している 6×6 盤の実例(| と - が領域の境界、# が塗り):

  the board           the answer

  2 . 2 1|. .        2 # 2 1|# .
    - - -   -          - - -   -
  .|. . 2 .|.        .|. # 2 .|.
  - - - - -          - - - - -
  2 .|. 1|. .        2 .|. 1|# .
        -                  -
  . .|1|1 . 1        # .|1|1 . 1
    - - -              - - -
  2|2 . .|. .        2|2 . #|. #
    -     -            -     -
  . .|0 . .|2        # .|0 . .|2

13 個の数字、6 領域、答えはちょうど 1 通り。このうち 6 個はうそである。

本当の数字を足すと、答えが増えることがある

先に一番おかしな結果から書く。

ヌリカベでもスリザーリンクでも、正しいヒントを 1 つ足せば答え集合は縮むだけだ。制約が増えるのだから当然で、作意者は「一意にならないならヒントを足せ」という単調性に頼って盤を作る。

うそわんではこれが成り立たない。領域のルールは「うちの数字のうちちょうど 1 つが間違い」だ。数字を 1 つ足すということは、うそをつく権利を持つ候補を 1 つ足すことでもある。それまで「この領域には間違いが 0 個しかないから不正解」と弾かれていた塗り方が、新しい数字が現れた瞬間に「その新しい数字が間違っている」という読みで合法になってしまう。

出荷盤で直接測った。盤を 1 枚とり、数字が書かれていない白マスを 1 つ選び、そこに正解に照らして正しい数字を書き足す。意図した答えは必ず合法のまま残る(領域のうそつきはそのままだから)。それ以外は保証がない。

盤 足した正しい数字 答えが 2 通り以上になった 一意のまま梯子では解けなくなった 無害 該当マスを持つ盤
6×6 425 9(2.1%) 0(0.0%) 416 7/36
8×8 760 14(1.8%) 4(0.5%) 742 13/36
10×10 1,206 32(2.7%) 2(0.2%) 1,172 20/36

全 2,391 通りのうち 55 回は盤の答えが増え、さらに 6 回は一意のまま梯子の射程外に出た。10×10 では 36 枚中 20 枚に、「正しいことを書き込むと壊れるマス」が少なくとも 1 つある。

実装にも跳ね返ってくる。生成器は「意図した答えを一様抽出 → 各領域にうそを 1 個仕込む → 残りの白マスに正直な数字を全部書く → 梯子が閉じられる限り正直な数字を消す」という手順だが、この消す工程を 1 パスで回すと極小にならない。数字 A が「まだ隣の数字 B が残っているから消せない」状態でも、B を消した後には A が消せるようになることがあるからだ(B が消えると領域のうそ候補が 1 つ減り、region 段の推論が強くなる)。不動点まで回す必要がある。最初これを 1 パスで書いていて、テストの「残った正直な数字はどれも load-bearing」が落ちて気づいた。

数字は 2 つの文で、どちらを読むかは教えてもらえない

6×6 の答え空間は全部メモリに載る。「塗りが接しない」「白がひとつながり」を満たす塗り方は 1,646,096 通りしかない。全部歩いて、あるマスの周りに塗りが何個あるかを数えれば、印刷された値の 2 つの読みが両方とも厳密に出る。

6×6 中央のマスに印刷された数字 正直だとしたときに残る空間 うそだとしたときに残る空間
0 45.58% 54.42%
1 34.70% 65.30%
2 16.56% 83.44%
3 3.16% 96.84%
4 0.00% 100.00%

2 つの読みで順位が完全に反転している。正直な数字として一番鋭いのは 3 で、空間を 3.16% まで削る。ところが同じ 3 をうそとして読むと 96.84% が残り、ほとんど何も言っていないに等しい。逆に 0 は正直だと 45.58% しか削らない鈍器だが、うそとして読むと 54.42% で、うその中では最も鋭い。

盤はどちらの読みが正しいかを決して言わない。だから目の前のどの数字も、同時に最強の情報であり最弱の情報でもある。先に「この領域でうそをついているのはどれか」を決めない限り、どの数字も使えない。これがジャンルの設計そのものだ。

4 と書いてある時点でうそ。犯人は連結条項

上の表の最終行はまるめた結果ではなく、厳密に 0 だ。

自分の次数と同じ数を印刷した数字——中央の 4、辺の 3、隅の 2——は、正直であるためには上下左右が全部塗りでなければならない。しかし数字マス自身は必ず白なので、そのマスは白の隣接を 1 つも持たなくなる。盤には他にも白マスがある(数字マスは全部白だ)から、白がひとつながりという条項が破れる。よってこの数字は正直ではありえず、その領域のうそつきが確定する。

面白いのは、この数字が自分の 4 近傍については何も言っていないことだ。うそである以上「周りの塗りは 4 個ではない」としか言っておらず、それは連結条項から自動的に従う。つまりこの数字が settle するのは自分の周りではなく、同じ領域の他の全部の数字が正直であることだ。

犯人が連結条項であることも測れる。同じ 6×6 の空間を 2 回数えればいい。

自分の次数を印刷した数字 白がひとつながりのとき 接触禁止条項だけのとき
中央(4 近傍)の 4 0.00% 1.47%
辺(3 近傍)の 3 0.00% 4.14%
隅(2 近傍)の 2 0.00% 9.67%

接触禁止だけなら普通に起きる配置が、連結条項を入れた途端にきっかり消滅する。

生成器はこの種の数字を狙ってもいないし避けてもいない(各領域のうそつきをランダムに選び、ランダムな誤値を与えるだけ)ので、出現率はジャンルの性質だ。出荷 108 枚に含まれる **1,393 個のうそのうち 404 個(29.0%)**がこの自己申告型だった。

盤は「普通のパズル」の重ね合わせ

各領域でうそつきを 1 つ名指ししてしまえば、うそわんは普通の塗りパズルに戻る。名指しされた数字は「間違っている」という既知の条件になり、残りは全部正直な数字になる。隠れているものは何もない。

したがって、領域が k₁, k₂, … 個の数字を持つ盤は k₁·k₂·… 枚の普通のパズルの重ね合わせだ。

盤 重ね合わされている普通のパズルの枚数(中央値) 最少 最多
6×6 216 48 864
8×8 13,824 864 124,416
10×10 2,488,320 110,592 37,324,800

盤の答えが 1 通りである以上、このうちちょうど 1 枚だけが解ける。残りは全部矛盾している。どの条項がそれを殺しているかを測った(6×6 の 36 枚、全 10,335 通りの読み)。

その読みを殺した条項 読みの数 割合
盤の形だけ(数字を 1 つも読まない) 0 0.00%
数字を上下界として読む 10,290 99.56%
領域の選言を厳密に解く 1 0.01%
白がひとつながり 8 0.08%
全探索が必要 0 0.00%
殺されない=これが答え 36 0.35%

99.6% は素朴な算術で死ぬ。構造条項が要るのはたった 9 通りだった。つまり、うそわんの難しさは個々の読みの難しさではなく、読みが重ね合わさっていること自体にある。うそつきさえ分かれば残りは平易なパズルだ、という直観がそのまま数字になった。

答えの総数を最後の桁まで

数字を全部剥がした「答え」は、「塗りマスが互いに非隣接」「その補集合が連結」というだけの集合だ。src/count.ts はこれをブロークンプロファイル DP で厳密に数える。フロンティアは各列について「塗りかどうか」と「白ならどの白連結成分か」で、行優先で平面格子を掃くので成分は交差しない(非交差分割になる)。だから状態数が小さいまま済む。

盤 答え 連結条項なし 連結条項の値段 状態数(最大層) 時間
4×4 562 1,234 2.19× 18 1 ms
6×6 1,646,096 5,598,861 3.40× 77 3 ms
8×8 118,930,018,898 660,647,962,955 5.55× 339 16 ms
10×10 208,786,414,361,204,882 2,030,049,051,145,980,050 9.72× 1,517 114 ms
12×12 8,821,565,703,462,781,281,195,276 162,481,813,349,792,588,536,582,997 18.4× 6,882 771 ms
14×14 8,951,629,622,004,424,856,628,885,578,891,048 3.39×10^35 37.8× 31,608 7.4 s
16×16 218,089,903,875,578,572,215,458,113,377,720,907,499,015,212 1.84×10^46 84.4× 146,604 55.5 s

ルールが 4 語しか割いていない「白マスは全部つながる」が、実はいちばん高い条項で、しかも盤が大きくなるほど高くなる(4×4 で 2.19 倍、8×8 で 5.55 倍、16×16 で 84.4 倍)。

左列の数列は 2026 年 9 月時点で OEIS に無い。右列はある——連結条項を落とすと格子グラフの独立集合そのものになるので A006506 で、掃引は特別扱いなしに公開されている全項を再現する。これは主張ではなく外部からの検算なので、テストにそのまま入れてある。

塗りは縁に寄る

同じ掃引を前向き・後向きに回すと、各フロンティア状態が「ここから何通り完成できるか」を持つ。前向き重み × 後向き完成数は、その状態を通る答えの総数そのものなので、「そのマスが塗りである確率」が標本ではなく全空間について厳密に出る。

盤 答えの総数 隅 縁 中央 隅÷中央
6×6 1,646,096 31.18% 22.50% 21.08% 1.48×
8×8 118,930,018,898 31.06% 21.64% 20.69% 1.50×
10×10 208,786,414,361,204,882 31.05% 21.76% 20.83% 1.49×
12×12 8,821,565,703,462,781,281,195,276 31.05% 21.96% 20.88% 1.49×

2 つの条項が同じ向きに効いている。中央の塗りマスは 4 近傍を白に固定させられるが、隅は 2 近傍で済む。しかも中央の塗りマスは白シートをちぎる機会がずっと多い(隅の塗りが切り離せるのは隅そのものだけだ)。縁は地価が安い。

生成器はこの機械からそのまま一様抽出する(フロンティアを前向きに歩き、各選択を「その先で完成できる答えの数」で重み付ける。棄却もリトライもしない)。一様性は仮定ではなく検算した。

盤 抽出回数 厳密な周辺確率とのマスごと最大乖離
6×6 200,000 0.293%
8×8 100,000 0.243%
10×10 40,000 0.525%

梯子

  • cell — 数字を 1 つも読まない。数字マスは白、塗りマスの 4 近傍は白。これだけ
  • count — 数字を上下界とうそつき帳簿として読む。各領域について「まだうそつきでありうる数字」を絞り(値が到達不能な数字は失格、既に成立してしまった数字も失格)、残りのどの読みでも正直な数字だけを飽和させる。うそつき候補が 1 つに絞れたら、その数字の実カウントが印刷値を外すように強制する
  • region — 選言を近似せず厳密に解く。領域の数字の近傍の和集合をとり、「塗りが接しない」「間違いがちょうど 1 つ」を満たす塗り方を全列挙して、全部が一致するマスを確定する
  • connect — 白はひとつながり。白マスから到達できない未定マスは白になれないので塗り、取り除くとシートが 2 つに割れる未定マスは塗れないので白。Tarjan 1 パスで全部まとめて出る
  • probe — 1 マス仮定して下位段を回し、盤が死んだら捨てる
段 6×6 確定率 6×6 完答 8×8 確定率 8×8 完答 10×10 確定率 10×10 完答
cell 46.8% 0/36 46.3% 0/36 46.0% 0/36
count 78.5% 4/36 80.7% 1/36 79.5% 0/36
region 95.7% 22/36 96.1% 14/36 96.6% 9/36
connect 100.0% 36/36 100.0% 36/36 100.0% 36/36
probe 100.0% 36/36 100.0% 36/36 100.0% 36/36

cell 段が 46% も確定させているのは、盤の半分近くが数字マス(=白確定)だからだ。出荷盤の数字密度は 46〜47%(6×6 で中央値 17 個、8×8 で 30 個、10×10 で 46 個)。

同じ段を、証明ではなく枝刈りとして値付ける

完全探索を回し、分岐点の間に許す伝播を段ごとに制限して、分岐点の数を数える。天井は 200,000。

許した伝播 6×6 分岐(中央値) 6×6 最悪 8×8 分岐(中央値) 8×8 最悪 10×10 分岐(中央値) 10×10 最悪
cell まで 29,123 124,127 天井 200,001(36 枚とも) 天井 200,001(36 枚とも)
count まで 2 70 6 317 11 412
region まで 0 14 1 135 3 35
connect まで 0 0 0 0 0 0

最初の 2 行の差がこのジャンルの全部だ。数字なしだと 6×6 でも中央値 29,123 分岐、上下界として読むだけで 2 分岐になる。count 段はどの数字がうそかを知らない——「どれがうそでありうるか」しか知らない——のに、それだけで 4 桁削れる。8×8 以降は最下段が天井内に 1 枚も終わらない。

読み違えは 2 対 2 に割れる

読み違え 盤 意図した答えが合法のまま 答え(中央値、12 で打ち切り) 一意のまま
領域にうそが 0 個でもよい 6×6 36/36 2 14/36
全部の数字が正しい 6×6 0/36 0 0/36
うそは盤全体で 1 つ 6×6 0/36 0 0/36
白は斜めでもつながる 6×6 36/36 1 22/36
領域にうそが 0 個でもよい 8×8 36/36 4 8/36
全部の数字が正しい 8×8 0/36 0 0/36
うそは盤全体で 1 つ 8×8 0/36 0 0/36
白は斜めでもつながる 8×8 36/36 2 13/36
領域にうそが 0 個でもよい 10×10 36/36 5 4/36
全部の数字が正しい 10×10 0/36 0 0/36
うそは盤全体で 1 つ 10×10 0/36 0 0/36
白は斜めでもつながる 10×10 36/36 4 9/36

他のパズルを実装したときは読み違えが全部「寛容側」に倒れたが、うそわんは 2 対 2 に割れた。寛容な 2 つ(うそ 0 個を許す・白が斜めでつながる)は答えを増やすだけなので意図した答えは合法のまま残り、最後まで異常に気づけない。厳しい 2 つ(全部正しい・うそは盤で 1 つ)は意図した答えを全サイズ 36 枚すべてで非合法にする。7 領域ある盤は最初から 7 個のうそを抱えているのだから当然だ。

こちらの壊れ方のほうが実は親切で、プレイヤーは別解に迷い込むのではなく行き詰まる。行き詰まりは気づける。

実装メモ

  • 状態の詰め方: フロンティアは 1 列あたり 1 ニブル(0=塗り、1..k=白成分ラベル、15=未到達)。ラベル数は ceil(C/2)+1 を超えない——フロンティアは行 r の接頭辞と行 r-1 の接尾辞で、同じ行の連続する白は同じ成分だから——ので C=20 でも 11 で収まり、ニブルに入る。12 列までは状態全体が double に収まるので Map のキーは数値、それ以上は短い文字列キー(速度は 1/3 程度、列は 8 本増える)
  • 成分の封鎖: 上のマスを塗りで置き換えるとき、その成分がフロンティアに他の代表を持たなければ二度と伸ばせない。これが許されるのは「それが最後の成分であるとき」だけで、封鎖後は以降どのマスも白にできない。この 1 ビットで「白は 1 成分」が正確に表現できる
  • 連結段: 未定マスごとに flood fill すると 100 マス盤でテストが分単位になる。関節点を Tarjan 1 パスで出し、切り離される部分木に白マスが含まれるかどうかで判定すれば 1 回で済む
  • 極小化は不動点まで: 前述のとおり。うそわんの数字は単調でないので 1 パスでは極小にならない
  • 数値は全部 counts.json / stats.json から生成している。README と HTML の表は tools/notes.mts が書き出すので、手で転記した数字はゼロ。テストは出荷盤 108 枚それぞれについて「合法」「一意」「梯子で無推測に閉じる」「各領域のうそがちょうど 1 つ」「うそは削除不能」「残った正直な数字は全部 load-bearing」を再導出する(全 46 テスト)

まとめ

うそわんの一文——「各領域に間違いがちょうど 1 つ」——は、難易度を上げるための飾りではなく、数字の意味論そのものを変えている。

  • 数字は 2 つの文の重ね合わせで、2 つの読みの鋭さは完全に逆順
  • 自分の次数を書いた数字は見た瞬間にうそで、自分の周りについては何も言わず、領域の他の数字を全部確定させる
  • そして、正しい数字を足すと答えが増えることがある

最後の 1 つが一番効く。作意者が当たり前に使っている「一意にならなければヒントを足せ」という道具が、このジャンルでは使えない。

デモ: https://sen.ltd/portfolio/usowan/
リポジトリ: https://github.com/sen-ltd/usowan

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?