マインスイーパーには有名な欠点があります。遅かれ早かれ盤面が二択を突きつけてきて、勝てるかどうかが推理ではなくコイン投げで決まってしまうのです。KEEPYBOO は日本で一人で作った小さな推理パズルで、約束は一つだけです。どの盤も、推測を求めません。この記事では、その約束をどう守っているか、盤の推論の深さをどう測っているか、そしてその計算に何がかかったかを説明します。

パズルの形

盤は n×n のマス目(5×5 から 9×9)で、どこかにおばけが隠れています。居場所を教える数字は三種類あります。

1 回タップで「いない」の印(×)、ダブルタップでおばけをつかまえます。LIFE は 3 つです。出荷した中で最大の盤は 9×9 で、おばけは 36 匹います。

6×6 の KEEPYBOO の盤。上に列の数、左に行の数、9 つの手がかりマス、最下行で 2 匹見つかっていて、空の第 1 列には × が並ぶ
ROUND 217、6×6 の盤です。単一条件の手を 2 巡したところで、第 1 列の数は 0 なので全部 ×、最下行は空きが 2 マスでおばけが 2 匹です。

つまり、マインスイーパーの「近傍の数」の規則に、ノノグラム風の「一列の数」を足し、すべてを最初から見せています。「開けて確かめる」操作が無いので、最初の一手の運もありません。

ここでの「推測なし」の正確な意味

「論理で解ける」は、どの論理かを言わなければ曖昧です。ここでは三層の規則を定め、その規則だけを使うプログラムが一度も間違えずに全部のおばけを見つけた盤だけを出荷しています。

第 1 層、条件を一つずつ。 行・列・手がかりマスはそれぞれ一つの条件で、マスの集合と目標の数からなります。条件のおばけが全部見つかっていれば、残りのマスはすべて ×です。残りの空きマスの数が、まだ見つかっていないおばけの数とちょうど同じなら、それらはすべておばけです。

第 2 層、条件を二つ同時に。 重なり合う二つの条件 A と B を取り、空きマスを A だけ・B だけ・共通部分 C に分けます。C にいるおばけの数には、次の範囲があります。

lo = max(0, a − |A だけ|, b − |B だけ|)
hi = min(a, b, |C|)

a と b は、A と B でまだ見つかっていないおばけの数です。lo = hi なら共通部分が確定し、それが A だけ・B だけの側も決めることがよくあります。マインスイーパーの熟練者が目で行う「部分集合」「区間」の推論が、これにあたります。

第 3 層、仮定を一つ。 あるマスをおばけ(または空)と仮定し、第 1・2 層を不動点まで伝播させ(最大 64 手)、矛盾が出れば逆が証明されます。背理法を、一度に一つの仮定に限ったものです。

この制限は意図したものです。仮定の入れ子も試しましたが、却下しました。十分に入れ子にすれば、どの盤のどのマスも「証明可能」になり、その言葉がプレイヤーにとって何も意味しなくなるからです。第 2 段階(仮定の中でもう一度場合分けをする。伝播の予算は 400)はコードには存在しますが、後述する裏側の検査でしか動かさず、出荷の判定には決して使いません。

同じ盤で、第 3 列を青、手がかり 2 の 3×3 近傍を橙で囲ったもの。共通する 2 マスに C の印があり、下の計算で lo と hi がともに 1 になる
同じ盤で、単一条件の手が尽きた場面です。第 3 列はあと 1 匹、最上行の手がかり 2 はあと 2 匹必要で、共通する 2 マスにはちょうど 1 匹いるはずです。これで両方の条件に 1 マスずつ確定します。

盤の作り方

端末上では何も生成しません。2000 問すべてをオフラインで生成し、1.26 MB の JSON として同梱しています。

生成器はただの棄却サンプリングです。盤の大きさごとに、おばけの数と手がかりの数を帯の中から選び(標準セットでは 5×5 が 4〜7 匹、9×9 が 18〜26 匹)、無作為に置き、第 1 層のソルバーだけで目標の「巡」数以内に解けなければ捨てます。1 巡とは、その時点で打てる手を全部打つ 1 回の走査のことです。数が 0 の条件が 3 つを超える盤も捨てます。ただで分かりすぎるからです。欲しい盤 1 問につき最大 600 回試行し、生き残りを巡数で仕分けして難易度の階段を組んでいます。

難しいセットは、わざと別の作り方をしています。第 2 層が必要な盤と、矛盾がちょうど一度必要な盤を作る生成器があり、有料の EXTREME と ULTIMATE はそれで性格(「重なりの制約連鎖」と「矛盾の網」)を得ています。ただ大きいだけではありません。

この全部の下に、安全網が二つあります。

  1. 生成中、ソルバーを保存した解答と突き合わせます。推論が一度でも解答と食い違えば、その盤は捨てます。規則で完全に解き切れる盤は、作り方からして解が一意です。二つの解が残る局面は決してありません。
  2. 別の監査が 2000 問すべてを再生し、確定した情報から第 1〜3 層で証明できるおばけだけを貪欲につかまえていきます。現在の結果は、計測 2000・未解決 0 です。

正直に書いておくと、古い方の 1000 問は以前のブラウザ版の試作から来ていて、独自のメタデータ(unique: true と推論の回数)を持っています。他と同じ監査を通っているので、同じように信頼しています。

推論の深さを測る

盤の大きさは、難易度の物差しとしては貧弱です。9×9 が準備運動のこともあれば、7×7 が意地悪なこともあります。欲しかったのはマスの数ではなく、盤がどれだけの推論を要求するかを映す数です。

その物差し logicDepth は、実際のゲームエンジンで各問題を「慎重な人が遊ぶように」遊んで求めます。毎手、打てる手がある最も低い層の手を全部打ち、層ごとの巡数を数えて、

logicDepth = direct + 2·pair + 2·contradiction

とします。重み 2 と 2 は勘ではありません。{2,3,4,6,8}² を総当たりし、段の中央値が単調に増え、段の間隔が最も均等になる組を採りました。2000 問での結果は次のとおりです。

必要とする問題数最大の巡数
第 1 層のみ96911
第 2 層(組)1,0318
第 3 層(矛盾一度)29313

段ごとの logicDepth の中央値は、EASY から ULTIMATE+ まで 3 / 3 / 4 / 5 / 7 / 9.5 / 10 / 12 / 14 / 19.5 です。出荷した中で最も深い盤は 43 です。EASY は組の推論を一度も要求せず、EXTREME II から上は必ず要求し、ULTIMATE は 150 問中 73 問で矛盾を要求します。

EASY から ULTIMATE+ まで 10 段の logicDepth の箱ひげ図。中央値は 3 から 19.5 まで上がり、最大は 43
2000 問の推論の深さを段ごとに示しています。箱が中央の半分、橙の線が中央値、ひげが最小と最大です。

深さを使った評価

盤ごとに難しさの数があれば、試験問題が受験者を測るのと同じやり方でプレイヤーを測れます。KEEPYBOO の「Logic Rating」は 1 母数のラッシュモデルで、能力 θ の人が深さ b の盤をきれいにクリアする確率は、次の式で表します。

P = 1 / (1 + exp(−a (θ − b)))

「きれいにクリア」とは、初回・ヒントなしで、つかまえた全部のおばけがその瞬間に証明可能だったことを指します(ゲームはタップのたびにこれを検査し、成り立つ場合だけその問題に 🧠 を付けます。まぐれ当たりは印を失います)。θ は弱い事前分布つきのニュートン法で当てはめ、100 倍して 0〜4400 の尺度で表示します。20 回の挑戦で現れ、60 回で「確定」と呼びます。傾き a = 0.3 は暫定で、データが溜まったら当て直します。コードにもそう書いてあります。

タップはすべて確定した情報だけで判定する(メモ書きは数えない)ので、🧠 の印は結果ではなく、推論についての言明です。

高くついた部分: 取りうる最高点と最低点

1 回のつかまえで 100 + 50 × (開いたマス) × (同時に完成した条件) 点が入るので、おばけを見つける順番が点数を変えます。欲しかった勲章は二つです。ミスなしで証明済みの最高点に達した 💎 と、証明済みの最低点に抑え込まれた 💀 です。

難しいのは「証明済み」の語です。すべての発見順の最大値は、おばけ G 匹に対して 2G 状態の部分集合動的計画法になります。組合せ添字を使った C 実装で、G = 33 は 18 分、G = 34 は 35 分、G = 36 の 3 問はそれぞれ 198〜257 分を、14 コアと約 33 GiB のメモリで要しました。以前の遅い版で計算した 1658 個の値は、新しい版で一つ残らず一致しました。

その上で、全問について「自由な」おばけも計算しました。最高点の経路のどこでつかまえても最高点を失わないおばけのことです。同じ状態空間をもう一度走査します(全問で約 20〜25 時間)。約 4 割のおばけが自由で、一匹もいない問題が 5 問あります。結果は盤ごとの縮約決定図に畳み(20 万行の表が 265 ノード・1074 バイトになった例があります)、全体で 296 KB の資産として同梱し、端末は参照するだけです。

やらなかったことと、その理由

ゲームは無料(1110 問)で、矛盾の網の盤が欲しい人向けに有料セットが二つあります。iOS と Android、14 言語に対応しています。この 10 月は、誰でもハロウィンのサウンドセットを受け取れます。

別の「推測なし」の定義でソルバーや生成器を作った方がいたら、ぜひ意見を交換したいです。どの論理を数えるかが、いちばん面白いところです。

App Store からダウンロード Google Play で手に入れよう

開発者が書きました。連絡先: contact@keepyboo.com · KEEPYBOO について · English