プレイバックシリーズ 10
世界の三大共通言語の一つがコンピュータ言語であり、その殆どが英語でかかれているのが実態。そこに敢えて日本語で構成するデータベースというのが、これがいろんな使い道があるとして前々回掲載のブログで紹介させて頂きました。
それが「日本語テータベースソフトで数独を解く(その1)」でした。今回はその2編であります。
ここで紹介させて頂く日本語データベースとは、管理工学研究所の「桐」です。
(前回の説明に続きます)
(4) 次にA表の行1 列2は、数字が記入されていない。
a) A表の行1で使用されている数字を見てみると、“5”と“3”である。そこで、B表のデータ2行目“行1 列B”には、「決定ステップ」欄 “空白” 「決定」欄 “空白”のままとし、「使用不可(行)」欄に“5”と“3”を入れる。
この場合数値“5”と“3”を“文字列”化しておく。
b) A表の行1 列Bで使用されている数字を見てみると、“4”と“2”と“8”である。そこで、B表のデータ2行目 “行1 列B”の、「決定ステップ」欄 “空白” 「決定」欄 “空白”のままとし、「使用不可(列)」欄にこれらの数字をそれぞれ文字化して“4”と“2”と“8”を入れる。
c) A表の行1 列B使用されている数字を見てみると、“4”と“2”と“8”である。そこで、B表のデータ2行目 “行1 列B”の、「決定ステップ」欄 “空白” 「決定」欄 “空白”のままとし、「使用不可(列)」欄にこれらの数字をそれぞれ文字化して“4”と“2”と“8”を入れる。
d) A表のブロック1(行1-3 列A-Cで含まれる枠9個) で使用されている数字を見てみると、“5”と“4”と“3”である。そこで、B表のデータ2行目 “行1 列B”の「使用不可(列)」欄にこれらの数字をそれぞれ文字化して“5”と“4”と“3”を入れる。
(5) B表の「使用不可(計)」欄は、 「使用不可(行)」、「使用不可(列)」 「使用不可(ブ)」に記入された文字列数値をそのまま組み合わせたものである(数字として合計したものではない、文字列を組み合わせたもの)。
一括処理コマンド(遠隔操作)でのプリグラム例
&使用不可行=[使用不可(行)] 「使用不可(行)」項にあるデータを変数&使用不可(行)へ代入
&使用不可列=[使用不可(列)] 「使用不可(列)」 〃 を変数&使用不可(列)へ代入
&使用不可群=[使用不可(ブ)] 「使用不可(ブ)」 〃 を変数&使用不可(ブ)へ代入
&使用不可(計)=&使用不可(行)+ &使用不可(列)+&使用不可(ブ)
そしてこれらを文字列のまま組み合わせる。
行訂正 [使用不可(計)]=&使用不可計 その結果を「使用不可(計)」項へ記入する。
(6) B表の「候補1」~「候補9」項
a)「候補1」の項には、「使用不可(計)」項に文字列数
字“1”が含まれていれば、“1”を表示する。
b)「候補n」の項には、「使用不可(計)」項に文字列数
字“n”が含まれていれば、“n”を表示する。
c) これを9まで行う。
(7) B表の「横件数」は、「候補1」~「候補9」項で記入
された欄の数を表示させる。
この「横軒数」で、その件数が“8”であれば、9個の数
字で使われていない数字が一つだけということになり、
その数は、「候補1」~「候補9」で使用されていない
数字ということになる。
(8) ここで導き出された数字を「決定」欄に記入する。
(9) この作業を99の枠で埋まっていない枠全てに就いて行
っていく。
こうして1回目の演算で、数値が書きこむ箇所(即ち、使用されていない数値が一つだけの空白枠)があれば、また(4)から(9)を繰り返す。
こうして得られた回答が次の例である。
【回答】
桐Ver.9sで回答に到達するに1分27秒かかりました。
そのプルグラムの一部を紹介させて頂きます。
*数独解読プログラム(例) 日本語データベースソフト
“桐”使用
変数宣言 数値{&行,&絞り込み行,&列番号,&群,&ステッ
プ,&列,&メニュー,&シーケンス}
変数宣言 文字列{&データ,&初期決定情報,&決定数字,&
列記号,&集積決定数字,&使用不可行,
&使用不可列,&使用不可群,&使用不可計}
&ファイル名1=”数独(すうどく)基本表1.tbl”
&ファイル名2=”数独(すうどく)演算表2.tbl”
表 &ファイル名1
ジャンプ 行=25
&開始時刻=#時刻
行訂正 [C]=&開始時刻
表 &ファイル名2
絞り込み解除 */*前回行った操作により絞り込んだままの演算表2.になっている場合に備えて解除する。*/
メニュー &メニュー,{0,4,20," 業 務 選 択 ",白}, ¥
{1,5,20,"(1) 問題の転写 ",黄}, ¥
{2,6,20,"(2) 使用不可行・列・群欄の計算 ",黄},\
{3,7,20,"(3) 使用不可合計欄への転写 ",黄},\
{4,8,20,"(4) 各数値欄への分解 ",黄},\
{5,9,20,"(5) 候補文字一つの箇所選択決定 ",黄},\
{6,10,20,"(6) 答えを基の表に転写 ",黄},\
{7,11,20,"(7) 全てを通して行う ",白}, \
{8,12,20,"(8) 表を見る ",白}, \
{9,13,20,"(9) 終 了 ",白}, \
{-1,15,20," いずれかを選んで下さい",白}
繰り返し &行=1,9
編集表 &ファイル名1 /*既に開いている基本表1を開く
繰り返し
&列記号=#対応文字列("A,B,C,D,E,F,G,H,I",&列番号)
ジャンプ 行=&行
&データA=#全角(#TRIM(#項目属性(1,0),4))
/* 項目[A]のデータを(#項目属性で)取り出し、それを(#TRIMで)」空白部があればそれを取り除き(#全角で)全角にする。それを変数&データAに代入する*/
&データB=#全角(#TRIM(#項目属性(2,0),4))
&データC=#全角(#TRIM(#項目属性(3,0),4))
&データD=#全角(#TRIM(#項目属性(4,0),4))
&データE=#全角(#TRIM(#項目属性(5,0),4))
&データF=#全角(#TRIM(#項目属性(6,0),4))
&データG=#全角(#TRIM(#項目属性(7,0),4))
&データH=#全角(#TRIM(#項目属性(8,0),4))
&データI=#全角(#TRIM(#項目属性(9,0),4))
編集表 &ファイル名2 /*編集対象表を演算表2に切り替
える*/
絞り込み [行]{=&行} /*行を繰り返しで指
定された行に絞り込む*/
繰り返し &列番号=1,9
ジャンプ 行=&列番号 /*行を特定*/
&データ=#条件選択(&列番号=1,&データA,&列番号=2,
&データB,&列番号=3,&データC, &列番号=4,&データD,
&列番号=5,&データE, &列番号=6, &データF,
&列番号=7,&データG,&列番号=8, &データH,
&列番号=9,&データI)
/*&列番号が繰り返し 1~9まで&列番号が1であれば、&データに&データAを入れる。 &データAには、予め [A]項のデータが入っている */
&初期決定情報=#条件選択(&データ=#未定義,#未定義,1,"初期")
/*データが入っているところは、同時に”初期”の文字を記入*/
行訂正 [決定]=&データ /*データを、ここで記入未定義も*/
行訂正 [決定ステップ]=&初期デ決定情報
/*[決定ステップ]項に#未定義か「初期」の文字を入れる */
分岐 (&データ=#未定義)旗10 /*データが入っている行だけその右の演算用欄をクリア*/
行訂正 [使用不可(行)]=#未定義
行訂正 [使用不可(列)]=#未定義
行訂正 [使用不可(群)]=#未定義
行訂正 [使用不可(計)]=#未定義
行訂正 [候補 1]=#未定義 /*データが入っていないところは、新情報を上書きするのでクリア不要*/
行訂正 [候補 2]=#未定義
行訂正 [候補 3]=#未定義
行訂正 [候補 4]=#未定義
行訂正 [候補 5]=#未定義
行訂正 [候補 6]=#未定義
行訂正 [候補 7]=#未定義
行訂正 [候補 8]=#未定義
行訂正 [候補 9]=#未定義
名札 旗100
繰り返し終了 /*&列番号の繰り返し終了*/
絞り込み解除* /*行の絞り込み解除*/
繰り返し終了 /*行の繰り返し終了*/
条件(&メニュー=1)表形式編集 /*出来上り表を見る*/
条件 (&メニュー<>7)終了/*通しで行場合以外は、こ
こで終了する。*/
名札 使用不可行の計算
*名札 仮200
繰り返し &行=1,9 /*行の繰り返し*/
絞り込み [行]{=&行} /*行の絞り込み*/
絞り込み [決定ステップ] {#未定義}
長々と 数独(ナンプレ)解読のソフトと書きましたが、果たして これで「すべての数独を解けるのでしょうか?
次回にその結果をお知らせします。

