子供さん向けの「スクラッチプログラミング」で、次のような
ナンバープレース パズル解きを目指します。
ナンプレの遊び方(
https://sudoku.com/jp)
ナンプレは、9×9のマス目を、jpタテ9マス・ヨコ9マス・各3×3のマス目が1から9までの数字をそれぞれひとつずつ含むように埋めるゲームです。ゲームの最初の段階では、いくつかのマスに既に数字が書き込まれています。あなたの任務は、ロジックを用いて残りのマスを埋め、9×9のマス目を完成させることです。以下のルールに従うことを忘れないでください:
• タテの列は1から9の数字をそれぞれひとつずつしか含むことができない
• ヨコの列は1から9の数字をそれぞれひとつずつしか含むことができない
• 各3×3のマス目は1から9の数字をそれぞれひとつずつしか含むことができない
そこで、空欄を順番に、「タテ」、「ヨコ」、「3×3」ブロックの数字を確認しながら
数字を埋めていきます。
次に9×9ナンプレの、問題と解答例を示します。
空セルを埋めていくには、次のような流れで、処理を行います。
① ナンプレ問題の入力
9かける9=81の数字を格納するリスト「数独入力」を作ります。
これと別に数独リストの位置を参照できるように、1から81までの数を
順番に入れたリスト「9-1」を作ります。
「数独入力」リストは、空欄を0として
1番目から81番目まで、改行しながら数字を入力します。(テキストかCSV)
リスト「数独入力」アイコンを右クリックして、入力ファイルを読み込みます。
これで、ナンプレ問題ファイル「数独リスト」が完成です。
② たて方向9セル計算
変数「数値N」で、調べるセルに順番に番号を付けます。
たて方向のセルは、「数値Nを9で割ったあまり」が最小値で
順番に9を足した数値を繰り返して、9個の数値の列になります。
この「たて方向9セル」は、「判定たて」リストに数値Nの番地が入ります。
「実数たて」リストに番地に対応するセルにある数値が入ります。
これらの処理を行うスクリプトは、つぎのようです。
③ よこ方向9セル計算
よこ方向9セル計算は、「数値Nを3で割ったあまり」が最小値で
順番に9を足した数値を繰り返して、9個の数値の列になります。
この「よこ方向9セル」は、「判定よこ」リストに数値Nの番地が入ります。
「実数よこ」リストに番地に対応するセルにある数値が入ります。
これらの処理を行うスクリプトは、つぎのようです。
④ 3×3方向9セル計算
3×3方向9セル計算は、「数値Nを3で割ったあまり」が最小値で
順番に9を足した数値を繰り返して、9個の数値の列になります。
3×3方向9セルは、次のような9個のブロックになります。
数値Nを3で割った商の値で
1以下では、①~③のブロックに
2以下では、④~⑥のブロックに
3以下では、⑦~⑨のブロックに
さらに上記の商を3で割った、余りの大きさで
余り1では、①、④、⑦に
余り2では、②、⑤、⑧に
余り無しでは、③、⑥、⑨に
それぞれ分類され、
ブロックの左上の値(数値Nの最小値)を指定する、補正をします。
この後は、ブロックの3行の数を順番にリストアップします。
この「3×3方向9セル」は、「判定しかく」リストに数値Nの番地が入ります。
「実数しかく」リストに番地に対応するセルにある数値が入ります。
これらの処理を行うスクリプトは、つぎのようです。
この処理が終わると「判別リスト」には、
「たて」「よこ」「3×3」の数列に該当する数値Nが入ります。
ここでは「数値50」の例です。
数値Nに該当する数独入力値を、「実数リスト」に表示します。
「実数リスト」のそれぞれ9個の数値が、1から9まで1個ずつ入っていることが
パズルの条件です。
*ここでは、「実数よこ」リストが、条件を満たしています。
(後から示す解法処理⑥、⑦で、数値50の空セルに、「5」を記入しています。)
条件(⑥、⑦)に合った数字を判別する
「実数リスト」の数字を1から9まで、順番に並べて、入っていない数字を
判別します。(数値計算リスト)
さらに数値Nのセルが空(0)であることを確認して、その数を代入します。
この判別プロセスは、次のスクリプトで行います。
空白セル(0)だった数値N=50番目は、5を代入することで
「よこ」「しかく」ブロックで「1から9が揃う」条件になりました。
「ナンプレ問題」と「解答」をマス目表示で見たいときは
9個数字の列を9列作って、並べると、マス目でみることもできます。
現在は実行画面の表示が小さいので6個の数字だけで
9列を横に並べることもできません。
表示場所が少なく、必要な変数表示が多いので
プログラム実行画面ではなく、編集画面を使って
プログラムスクリプトを分けながら使うと便利です。
どんな感じで動くかは、のちほどご報告します。