Note
この記事でいう「初級・中級・上級」は、この解説記事を3段階に分けた読み物としての順番です。Number Place本体の難易度はnumberplace/engine.jsのlevelForBlanks関数が空きマス数(givensの少なさ)だけで判定しており、実際に解く上での論理的な難しさ(どの技法が必要か)を測るものではありません(空きマス数だけに基づく暫定的な指標であることはnumberplace/rating.jsのコメント自身が明記しています)。この記事の初級・中級・上級は、あくまでこの記事が選んだ実例を解くのに必要な技法の複雑さを指します。ただし実例の選定にあたっては、便宜上それぞれアプリ側の難易度easy・medium・hardで生成した盤面から選んでおり(初級編はlevel=easy、中級編はlevel=medium、上級編はlevel=hard)、この対応はこの記事の実例に固有のもので、Number Placeの難易度判定が解く上での難しさを保証している、という意味ではありません。
結論。Number Placeの各マスには、そのマスが属する行・列・3×3ブロックにすでに入っている数字と同じ数字は入らない。空きマスごとに「1〜9のうち、同じ行・同じ列・同じ3×3ブロックにまだ現れていない数字」を数え上げ、それがちょうど1個だけに絞られたマスがあれば、そのマスはその数字で確定する(naked single)。 盤面によっては、この確定を繰り返すだけで、一度も仮定を置かずに全マスが埋まることがある。この記事の実例(9×9・36マス空き)は、まさにこの繰り返しだけで36マスすべてが確定し、実際の完成形(答え)と完全に一致する。
盤面の見方: 行・列・3×3ブロックという3つの単位
Number Placeの盤は9×9=81マスで、太い罫線によって9個の3×3ブロックに区切られています。ルールは次の1つだけです。
- 各行(横9マス)・各列(縦9マス)・各3×3ブロックのそれぞれに、1〜9の数字がちょうど1回ずつ入る。
最初から数字が入っているマス(givens)はgivenという見た目(背景色などで区別)で表示され、変更できません。それ以外の空きマスに、プレイヤーが1〜9を入力していきます。
使える操作(合法手)
- マスをタップ(クリック)して選ぶ: 選んだマスが
selectedの見た目になります。given(最初から数字が入っているマス)は選んでも数字ボタンが押せません。 - 数字ボタン、またはキーボードの数字キー(1〜9)で入力: 選んだマスに数字が入ります(
numberplace/app.jsのinputDigit)。同じマスに別の数字を入力すると上書きされます。 - 消去(キーパッドの「erase」ボタン、またはBackspace/Delete/0キー): 選んだマスの数字を消します。
- メモ入力(「メモ入力(候補数字)」ボタン、またはNキー): 通常入力とは別のモードで、選んだマスに複数の候補数字を小さく書き添えられます(
notes[selected] ^= (1 << (v - 1))、同じ数字をもう一度押すと消えます)。数字がすでに確定しているマスにはメモを付けられません。この記事で説明する「候補を絞り込む」という考え方を、実際の盤面上でそのままメモとして書き留めるのに使えます。 - 一手戻す(「一手戻す」ボタン): 直前の1回の入力操作(数字入力・消去・メモの追加/削除のいずれか1回分)だけを取り消します。
- 1マスのヒント(「1マスのヒント」ボタン): まだ答えと異なるマス(空欄、または誤った数字が入っているマス)を1つだけ自動で正しい数字に直します(
numberplace/app.jsのhint。grid.findIndex((v, j) => puzzle.givens[j] === 0 && v !== puzzle.answer[j])、盤面を先頭(行1列1)から走査して最初に見つかったマスが対象です)。 - 答えを見る(「答えを見る」ボタン): 残り全マスを一括で正しい数字に直します。
「1マスのヒント」「答えを見る」のどちらを使っても、クリア自体はできますが「解答補助あり」の扱いになり、レート記録の対象外になります(numberplace/app.jsのassistedフラグ)。
盤面のどこかに、同じ行・同じ列・同じ3×3ブロック内で数字が重複しているマスがあれば、そのマスすべてにconflictの見た目(警告表示)が付きます(numberplace/engine.jsのconflictCells)。全81マスが埋まり、かつ矛盾が1つもない状態だけがクリアです。
技法: naked single(裸のシングル) — 候補がちょうど1つに絞られたマス
あるマスに入りうる数字は、「1〜9」から、そのマスが属する行・列・3×3ブロックにすでに入っている数字をすべて除いた残りです。この残りの候補がちょうど1個しかなければ、そのマスはその数字で確定します。これを**naked single(裸のシングル)**と呼びます(この用語自体はNumber Place本体の画面やコードには登場しない、数独の一般的な解法用語です)。
candidatesの絞り込み自体は、numberplace/engine.jsのバックトラッキング探索が使う考え方(511 & ~(rows[r] | cols[c] | boxes[b])というビット演算で候補を求める)と同じですが、この記事で説明する「1マスずつ、候補が1個になったら確定する」という手順自体は、エンジンのコードに実装された機能ではありません。エンジンは候補が最も少ないマスを選んでバックトラッキング探索するだけで、「人間が目で追える形で1マスずつ確定させる」処理は行っていません。この記事の手順は、標準的な数独の解き方をこの記事のために実装し、生成済みの盤面に対して実行して検証したものです(検証方法は「読者の検証方法」の節で説明します)。
実例: 9×9盤を、仮定なしで最後まで解く
シード"notes-numberplace-easy-1"・難易度"easy"で生成した盤面です(E.generate('notes-numberplace-easy-1', 'easy')、1回目の試行でこの条件を満たしました)。出題時点の数字配置は次のとおりです(.は空欄)。空きマスは36個で、levelForBlanks(36)は'easy'と判定されます(BLANK_THRESHOLDS.easy = 45以下)。
8 5 . | . 6 4 | 1 7 9
9 3 . | . . . | 6 2 5
. . 7 | . 2 . | . . .
------+-------+------
3 4 . | 5 . 2 | . 1 .
. . . | 4 7 3 | 9 5 .
5 . 9 | 8 1 6 | 2 . 3
------+-------+------
. . 3 | 2 . . | . . 1
. 6 5 | 7 3 . | 4 8 .
4 2 . | 6 5 . | 3 . .
最初の2手: 行がほぼ埋まっているマスから
行1(1列目)は8 5 . . 6 4 1 7 9で、空きは列3・列4の2マスだけです。列3(マス「行1列3」)を見ると、行1にすでに入っている数字は{1,4,5,6,7,8,9}(7個)で、残りは{2,3}の2択に見えますが、列3にはすでに{3,5,7,9}が、このマスの属する3×3ブロック(行1〜3・列1〜3)にはすでに{3,5,7,8,9}が入っています。行の候補{2,3}から、列とブロックにすでにある3を除くと、残るのは2だけです。したがって行1列3は2で確定します(1手目)。
この結果、行1の空きは列4の1マスだけになり、行にすでに入っている8個の数字(1,2,4,5,6,7,8,9)から、残る数字は自動的に**3だけになります。したがって行1列4は3**で確定します(2手目)。これは列・ブロックを見るまでもなく、行だけで候補が1個に絞られる典型例です。
3手目〜10手目: 同じ考え方を機械的に繰り返す
以降も同じ手順(そのマスの行・列・ブロックにすでに入っている数字を除いて、残りが1個になるかを確認する)を、盤面の左上から右下に向かって繰り返し適用していくと、次のように確定していきます(使用済みは、その時点でそのマスの行・列・ブロックにすでに入っている数字の一覧)。
| 手順 | マス | 数字 | 行の使用済み | 列の使用済み | ブロックの使用済み |
|---|---|---|---|---|---|
| 1 | 行1列3 | 2 | 1,4,5,6,7,8,9 | 3,5,7,9 | 3,5,7,8,9 |
| 2 | 行1列4 | 3 | 1,2,4,5,6,7,8,9 | 2,4,5,6,7,8 | 2,4,6 |
| 3 | 行2列4 | 1 | 2,3,5,6,9 | 2,3,4,5,6,7,8 | 2,3,4,6 |
| 4 | 行2列5 | 8 | 1,2,3,5,6,9 | 1,2,3,5,6,7 | 1,2,3,4,6 |
| 5 | 行2列6 | 7 | 1,2,3,5,6,8,9 | 2,3,4,6 | 1,2,3,4,6,8 |
| 6 | 行3列2 | 1 | 2,7 | 2,3,4,5,6 | 2,3,5,7,8,9 |
| 7 | 行3列4 | 9 | 1,2,7 | 1,2,3,4,5,6,7,8 | 1,2,3,4,6,7,8 |
| 8 | 行3列6 | 5 | 1,2,7,9 | 2,3,4,6,7 | 1,2,3,4,6,7,8,9 |
| 9 | 行3列7 | 8 | 1,2,5,7,9 | 1,2,3,4,6,9 | 1,2,5,6,7,9 |
| 10 | 行3列9 | 4 | 1,2,5,7,8,9 | 1,3,5,9 | 1,2,5,6,7,8,9 |
たとえば7手目(行3列4=9)は、行に{1,2,7}(3個)しか使われておらず候補が多そうに見えますが、**列にはすでに8個(1,2,3,4,5,6,7,8)**が入っており、列だけで候補が9の1個に絞られています。このように、行・列・ブロックのどれが決め手になるかはマスごとに異なります。
11手目以降: 同じ手順を最後まで
同じ手順(行・列・ブロックの使用済み数字を除いて、残りが1個になったマスを確定する)を繰り返すと、残る26マスも次の順で確定していきます。
11 行4列5=9 12 行4列7=7 13 行5列2=8 14 行5列9=6 15 行6列2=7
16 行6列8=4 17 行7列1=7 18 行7列2=9 19 行7列5=4 20 行7列6=8
21 行7列7=5 22 行7列8=6 23 行8列1=1 24 行8列6=9 25 行8列9=2
26 行9列3=8 27 行9列6=1 28 行9列8=9 29 行9列9=7 30 行2列3=4
31 行3列1=6 32 行3列8=3 33 行4列3=6 34 行4列9=8 35 行5列1=2
36 行5列3=1
36手すべてで、行・列・ブロックの候補を除いていくと残りがちょうど1個になり、一度も「2択のうちどちらか分からない」という場面が現れません。 36手目が終わった時点で全81マスが埋まり、完成形は次のとおりです。
8 5 2 | 3 6 4 | 1 7 9
9 3 4 | 1 8 7 | 6 2 5
6 1 7 | 9 2 5 | 8 3 4
------+-------+------
3 4 6 | 5 9 2 | 7 1 8
2 8 1 | 4 7 3 | 9 5 6
5 7 9 | 8 1 6 | 2 4 3
------+-------+------
7 9 3 | 2 4 8 | 5 6 1
1 6 5 | 7 3 9 | 4 8 2
4 2 8 | 6 5 1 | 3 9 7
この完成形は、E.generateが実際に生成時点で持っていた完成盤(answerフィールド)と1マスの違いもなく一致します(実行して確認済み)。各行・各列・各3×3ブロックに1〜9が過不足なく1回ずつ現れることも確認済みです。
誤りやすい判断
- 「候補が少ないマス」と「候補が1個に絞られたマス」を混同しない。 上の表の7手目のように、行だけ見ると候補が3個ありそうでも、列やブロックまで含めると1個に絞られることがあります。逆に、行の候補が1個に見えても、それがすでに他の理由(そのマス自身に数字が入っている等)で確定済みなら再確認は不要です。必ず行・列・ブロックの3つすべてを突き合わせてください。
- 確定した数字を、他のマスの判定にすぐ反映させる。 上の表の1手目(行1列3=2)は、2手目(行1列4=3)の判定に直接使われています(行1列3が確定したことで、行1の使用済み数字が1個増える)。確定済みの数字を反映し忘れると、まだ候補が2個以上あるように見えてしまいます。
- この記事の手順で解けたのは、この実例(このシード・この難易度)固有の結果です。 空きマスが36個(
easy)だからといって、すべてのeasy盤面がnaked singleだけで解けるとは限りません(「この記事が確認していないこと」で改めて述べます)。
読者の検証方法
- 同じ盤面は、シード
"notes-numberplace-easy-1"・難易度"easy"で誰でも再現できます(Number Place本体のシード欄にシードを入力して「この問題で再挑戦」を使うか、numberplace/engine.jsをrequireしてE.generate('notes-numberplace-easy-1', 'easy')を実行しても同じ結果が得られます)。 - 実際にプレイする場合は、メモ入力モードで各マスの候補を書き出しながら進めると、この記事の表と同じ絞り込みを自分の手元で再現できます。
- 手順に不安がある場合は、1マスずつ「1マスのヒント」で答え合わせしながら進めても、手順の妥当性の確認には支障ありません(ヒントを使うとレート記録の対象外にはなります)。
- この記事の36手の判定手順自体は、Node.js上でこの記事のために実装したスクリプト(候補計算は
numberplace/engine.jsの511 & ~(rows[r] | cols[c] | boxes[b])と同じ式)を実行し、結果をE.generateのanswerと突き合わせて確認しました。
この記事が確認していないこと
- 「naked singleの繰り返しだけで、仮定なしに全マスが確定する」という展開は、この記事の実例(このシード・この難易度)固有のものです。Number Placeには盤面ごとの論理的な難しさを事前に判定する仕組みが実装されていないため(難易度は空きマス数だけで決まります)、別の
easy盤面で同じ手順(naked singleだけ)で解けることは保証されません(実際にこの記事を書く過程で試した他のeasyシードの多くも同じ36前後のnaked singleだけで解けましたが、すべてのeasy盤面を網羅的に確認したわけではありません)。 - 「もう1つの基本技法」であるhidden single(あるマスだけがその数字を置ける、というもの。1つの行・列・ブロックの中で、候補としてその数字を持つマスが1つしかない場合に確定する)は、この記事の実例では一度も使われませんでした(36手すべてがnaked singleでした)。hidden singleは中級編(その2)の実例で登場します。
- 中級・上級で必要になる「仮に置いて確かめる」判断は扱っていません。中級編(その2)・上級編(その3)で扱います。
この結果が言っていないこと
- 検証は
numberplace/engine.js・numberplace/app.js(エンジンv1、2026-09-29時点)を対象にしています。将来の版で表示・判定基準が変わる可能性があります。 - 「naked single」「候補」「使用済み」という用語・表・手順番号は、この記事独自の説明用の表記です。Number Place本体の画面上には候補の自動表示や手順番号はなく、実際のUIはマスの数字とメモ(プレイヤーが自分で書く候補)のみで判断します。
- この記事の解法手順(naked singleを繰り返し適用する処理)は
numberplace/engine.jsに実装された機能ではなく、この記事のために独立に実装し、生成済みの盤面(E.generateの出力)に対して実行して検証したものです。