使用方法
1 画面に.直接入力する方法
(1) Open Page (Sheet 1)を選択する。
(2) Clear (Blue ) のコマンドボタンをクリックして画面の数字を消す。
(3) 画面のセルに直接問題の数字を入力する。
(4) Problem の番号を(D2)のセルにインプットする。
(5) 再度問題を使うときには、Store Problem のコマンドボタンをクリックする。
(6) Cal.(Input) のコマンドボタンをクリックして計算を開始する。
(7) 正しい答えが得られたときには、Conquer が赤字で表示される。
(8) 同時に問題のレベルと計算時間が表示される。
(9) 計算手順はProcedure のコマンドボタンをクリックする。
(10) 解析の順番にセルの番地と入る値と使用する解法が表示されている。
(11) グラフ1には各セルの値を探すのに要した経過時間がプロットされる。
(12) 前にインプットしてストアした問題を再計算する時には、問題番号を(D2)に入れる。
(13) ReInput Problem をクリックするとストアーした問題が画面に呼び出される。
(15) 再計算の手順は(6)以降と同じである。
2. データベースから入力する方法
(1) このファイルには、「ポケット数独上級篇」(Sheet2)と「ニコリ数独名品100選」(Sheet6)
が入っている。
(2) データベースを呼び出すのは、Sheet1のAC24に書かれた当該セルをダブルクリックする。
(3) M1のセルにインプットされたのを確認する。
(4) D2のセルに問題番号を入力する。
(5) Input Problem のコマンドボタンをクリックすると画面に問題が表示される。
(6) あとの操作は1.の(6)以降とおなじである。
(7) データベースを作るのは空白シートを用意して同じ形式で問題を入力する。
(8) Sheet 1 のマクロを凡例に沿って書き換える。
3. 連続計算の方法
(1) 一冊の本や複数の問題を連続して計算するときに使用する方法である。
(2) 一連の問題を空白シートにデータベースシート(Sheet2 やSheet 6)と同じ形式で作成する。
(3) Sheet1 にタイトルをつけて、A22近辺のセルに書き込む。
(4) Sheet1 のマクロに凡例と同様にタイトル名にしたがって、isheet=入力シート、
dsheet="Sheet4"を記入する。
(5) 問題の数を1番から連続番号でつけ、最初と最後の問題をマクロに記入する。
(6) 問題をインプットして、連続計算の準備は完了する。
(7) 計算したい問題の最初と最後の問題番号をSheet1 のB2 とC2 にインプットする。
(8) Continuous Cal. のコマンドボタンをクリックすると計算が開始する。
(デスプレイの表示画面を映すと時間がかかるので、Z30のコマンドボタンを使うと速い)
(9) 計算結果の解答はResult of Cal. のコマンドボタンをクリックする。正解であることの
Conquer のマーク、問題のレベルおよび解析時間も同時に表示される。
(10) Summary of Cal. のコマンドボタンをクリックすると、連続計算のまとめが表示される。
表出セルおよび空白セルの数、消費時間、本解法でのレベル評価と作者(出版社)の
公表レベルおよび使用された解法の種類別の回数などである。
2009年10月3日土曜日
2009年10月2日金曜日
(56) プログラムの操作の説明
プログラムの操作は簡単で次の順序で計算が可能である。
(1) 画面をクリアー
(2) Database (Sheet 6) にあらかじめ入力した問題の「問題番号」を
入れる。
(3) 「計算開始」をクリック。
(4) 解が得られ、数独ルールを満足していると「Conquer」マークが示され、
同時に問題の難易度レベルおよび計算時間が示される。
(5) 解き方の手順を見るには、「とき方のヒント」をクリック。49個の空白セルに
入る順番とその番地と数字と使用した見つけ方が示されます。
(6)計算過程にかかった計算時間の推移は「解析過程のグラフ」をクリック。
(7)探索法の種類によって重みをつけてやり、計算でえられた探索法の順番
にしたがって人間の思考の過程をシミュレートするには「シミュレーション」
をクリック。
実際に人間が解いた場合の経過時間の経緯は「Human」をクリック。
(8)連続計算をする場合には「連続計算」をクリック。
初級の問題ならほぼ2分前後でとくことができる。
(1) 画面をクリアー
(2) Database (Sheet 6) にあらかじめ入力した問題の「問題番号」を
入れる。
(3) 「計算開始」をクリック。
(4) 解が得られ、数独ルールを満足していると「Conquer」マークが示され、
同時に問題の難易度レベルおよび計算時間が示される。
(5) 解き方の手順を見るには、「とき方のヒント」をクリック。49個の空白セルに
入る順番とその番地と数字と使用した見つけ方が示されます。
(6)計算過程にかかった計算時間の推移は「解析過程のグラフ」をクリック。
(7)探索法の種類によって重みをつけてやり、計算でえられた探索法の順番
にしたがって人間の思考の過程をシミュレートするには「シミュレーション」
をクリック。
実際に人間が解いた場合の経過時間の経緯は「Human」をクリック。
(8)連続計算をする場合には「連続計算」をクリック。
初級の問題ならほぼ2分前後でとくことができる。
2009年9月28日月曜日
(53) 数独本の計算速度の比較
2006年9月1日、本ソフトの目玉の一つは数独本一冊を自動連続計算ができる点である。探索法毎の重みずけをしなくても、パソコンでの計算時間はほぼ、問題の難易度に比例するようである。そこで、難問ナンプレの本を買って来てあったものについて、連続計算を実施した。結果は次の通りである。
ニコリ数独名品 100選 (100題) 2分34秒
ポケット数独上級編 (105題) 3分10秒
激辛数独 1 (105題) 3分 1秒
激辛数独 2 (105題) 3分23秒
激辛数独 3 (105題) 3分36秒
西尾徹也のナンプレ BS 100 (100題) 3分23秒
ナンプレ超上級編 11 (101題) 5分37秒
難問ナンプレに挑戦 2 (101題) 7分50秒
ニコリ数独名品 100選 (100題) 2分34秒
ポケット数独上級編 (105題) 3分10秒
激辛数独 1 (105題) 3分 1秒
激辛数独 2 (105題) 3分23秒
激辛数独 3 (105題) 3分36秒
西尾徹也のナンプレ BS 100 (100題) 3分23秒
ナンプレ超上級編 11 (101題) 5分37秒
難問ナンプレに挑戦 2 (101題) 7分50秒
2009年9月21日月曜日
(49) B search , L search and C search
g matrix を使うと、
B search : ブロック ( igrp ) に一つしかない数字 (numb ) をもつセルを探す。これは、gg matrix を使って、gg ( igrp , numb , 2 ) = 1 とあらわすことができる。
同様にして、
L search : 行 ( ilin ) に一つしかない数字 (numb ) をもつセルを探す。これは、gl matrix を使って、gl ( ilin , numb , 2 ) = 1 とあらわすことができる。
Sub B_search()
For igrp = 1 To z
For numb = 1 To z
If gg(igrp, numb, 2) = 1 Then
cc = gg(igrp, numb, 3)
row_column_number
i1 = aa: i2 = bb
Else
GoTo contnumb
End If
If Sheets("Sheet1").Cells(ppp + i1, qqq + i2) <> "" Then GoTo contnumb
Sheets("Sheet1").Cells(ppp + i1, qqq + i2) = numb
numa = numa + 1
Sheets("Sheet6").Cells(numa + 17, 1) = numa - 1
Sheets("Sheet6").Cells(numa + 17, 2) = "(" & i1 & "," & i2 & ")"
Sheets("Sheet6").Cells(numa + 17, 3) = numb
Sheets("Sheet6").Cells(numa + 17, 4) = sch
Sheets("Sheet6").Cells(numa + 17, 21) = 0.01 * (Int(100 * (Timer - timer0)))
Sheets("Sheet6").Range("A18") = numa - 1
Sheets("Sheet1").Range("D6") = numa - 1
contnumb:
Next numb
Next igrp
End Sub
B search : ブロック ( igrp ) に一つしかない数字 (numb ) をもつセルを探す。これは、gg matrix を使って、gg ( igrp , numb , 2 ) = 1 とあらわすことができる。
同様にして、
L search : 行 ( ilin ) に一つしかない数字 (numb ) をもつセルを探す。これは、gl matrix を使って、gl ( ilin , numb , 2 ) = 1 とあらわすことができる。
C search : 列 ( icol ) に一つしかない数字 (numb ) をもつセルを探す。これは、gc matrix を使って、gc ( icol , numb , 2 ) = 1 とあらわすことができる。
B search に対して、実際のプログラムを以下に示す。これらの探索法は SUDOKU_Ver33 から使われている。
Sub B_search()
For igrp = 1 To z
For numb = 1 To z
If gg(igrp, numb, 2) = 1 Then
cc = gg(igrp, numb, 3)
row_column_number
i1 = aa: i2 = bb
Else
GoTo contnumb
End If
If Sheets("Sheet1").Cells(ppp + i1, qqq + i2) <> "" Then GoTo contnumb
Sheets("Sheet1").Cells(ppp + i1, qqq + i2) = numb
numa = numa + 1
Sheets("Sheet6").Cells(numa + 17, 1) = numa - 1
Sheets("Sheet6").Cells(numa + 17, 2) = "(" & i1 & "," & i2 & ")"
Sheets("Sheet6").Cells(numa + 17, 3) = numb
Sheets("Sheet6").Cells(numa + 17, 4) = sch
Sheets("Sheet6").Cells(numa + 17, 21) = 0.01 * (Int(100 * (Timer - timer0)))
Sheets("Sheet6").Range("A18") = numa - 1
Sheets("Sheet1").Range("D6") = numa - 1
contnumb:
Next numb
Next igrp
End Sub
2009年9月20日日曜日
(48) g matrix を作るマクロ
SUDOKU_Ver.33 において、初めて g matrix が作成され、使用された。g matrix は gg_matrix , gl_matrix , gc_matrix よりなる。いずれも 1 から 9 までの任意の数字 ( numb ) が、あるブロック ( igrp ) あるいは、ある行 ( ilin ) あるいは、ある列 ( icol ) に存在する空白セルがいくつ、どこにあるかを表す三次元 matrix である。
gg_matrix を例にとり、その内容を示そう。
gg ( igrp , numb , 1 ) = igrp 数字の存在するブロック番号
gg ( igrp , numb , 2 ) = num digit が numb のそのブロックに存在する空白セルの数
gg ( igrp , numb , 3 ) = ( i1, j1 ) : num = 1 候補 numb をもつ一番目の空白セルの位置
gg ( igrp , numb , 4 ) = ( i2 ,j2 ) : num = 2 候補 numb をもつ二番目の空白セルの位置
・・・・・・・・・・・
gg ( igrp , numb , 2+num ) = ( inum , jnum ) 候補 numb をもつ num 番目の空白セルの位置
gg_matrix は、 can matrix よりつくられる。そのマクロ block_number_table を次に示す。
Sub block_number_table ( )
ReDim gg(z, z, z + 2)
ReDim xi(z), yi(z), bz(z)
For i = 1 To z
For j = 1 To z
For k = 1 To z + 2
gg ( i , j , k ) = " "
Next k
Next j
Next i
empty_cell = Sheets("Sheet1").Range("K2")
For numb = 1 To z
For igrp = 1 To z
num = 0
For i = 1 To empty_cell
If can(i, 4) <> igrp Then GoTo conti
ikumi = can(i, 5)
For j = 1 To ikumi
If numb = can(i, 5 + j) Then
num = num + 1
xi(num) = can(i, 2): yi(num) = can(i, 3)
bz(num) = can(i, 1)
End If
Next j
conti:
Next i
gg(igrp, numb, 1) = igrp
gg(igrp, numb, 2) = num
For k = 1 To num
gg(igrp, numb, 2 + k) = bz(k)
Next k
Next igrp
Next numb
End Sub
gg_matrix を例にとり、その内容を示そう。
gg ( igrp , numb , 1 ) = igrp 数字の存在するブロック番号
gg ( igrp , numb , 2 ) = num digit が numb のそのブロックに存在する空白セルの数
gg ( igrp , numb , 3 ) = ( i1, j1 ) : num = 1 候補 numb をもつ一番目の空白セルの位置
gg ( igrp , numb , 4 ) = ( i2 ,j2 ) : num = 2 候補 numb をもつ二番目の空白セルの位置
・・・・・・・・・・・
gg ( igrp , numb , 2+num ) = ( inum , jnum ) 候補 numb をもつ num 番目の空白セルの位置
gg_matrix は、 can matrix よりつくられる。そのマクロ block_number_table を次に示す。
Sub block_number_table ( )
ReDim gg(z, z, z + 2)
ReDim xi(z), yi(z), bz(z)
For i = 1 To z
For j = 1 To z
For k = 1 To z + 2
gg ( i , j , k ) = " "
Next k
Next j
Next i
empty_cell = Sheets("Sheet1").Range("K2")
For numb = 1 To z
For igrp = 1 To z
num = 0
For i = 1 To empty_cell
If can(i, 4) <> igrp Then GoTo conti
ikumi = can(i, 5)
For j = 1 To ikumi
If numb = can(i, 5 + j) Then
num = num + 1
xi(num) = can(i, 2): yi(num) = can(i, 3)
bz(num) = can(i, 1)
End If
Next j
conti:
Next i
gg(igrp, numb, 1) = igrp
gg(igrp, numb, 2) = num
For k = 1 To num
gg(igrp, numb, 2 + k) = bz(k)
Next k
Next igrp
Next numb
End Sub
2009年9月19日土曜日
(47) candy_matrix と M_search
SUDOKU_Ver32 ( CTM ) は Candy Table Matrix を使った最初のプログラムである。空白セル番号 j である candy matrix , can ( j , i ) は 5+k 個の要素を持つ二次元マトリックスである。
can ( j , 1 ) = 空白セルの番地、例えば、 ( 3 ,8 )
can ( j , 2 ) = 空白セルの行番号、 3
can ( j , 3 ) = 空白セルの列番号、 8
can ( j , 4 ) = 空白セルの属するブロック番号、例えば、中央ブロックは 5
can ( j , 5 ) = 候補の個数、 k 個とする。
can ( j , 6 ) = 一番目の候補、 a1
can ( j , 7 ) = 二番目の候補、 a2
・・・・・・・・・・・
Sub M_search()
empty_cell = Sheets("Sheet1").Range("K2")
For i = 1 To empty_cell
If can(i, 5) = 1 Then
ii = can(i, 2)
jj = can(i, 3)
ak = can(i, 6)
If Sheets("Sheet1").Cells(ppp + ii, qqq + jj) <> "" Then GoTo contii
Sheets("Sheet1").Cells(ppp + ii, qqq + jj) = ak
numa = numa + 1
Sheets("Sheet6").Cells(numa + 17, 1) = numa - 1
Sheets("Sheet6").Cells(numa + 17, 2) = "(" & ii & "," & jj & ")"
Sheets("Sheet6").Cells(numa + 17, 3) = ak
Sheets("Sheet6").Cells(numa + 17, 4) = sch
Sheets("Sheet6").Cells(numa + 17, 21) = 0.01 * (Int(100 * (Timer - timer0)))
Sheets("Sheet6").Range("A18") = numa - 1
End If
contii:
Next i
End Sub
M_search の「候補を一つしか持たないセル」は、 can ( j , 5 )= 1 と簡単にあらわすことができるので、マクロの中で四行目だけが重要である。あとは何番目に見つかったかや、その番地や数字、その探索法と時間を記録しているだけである。
can ( j , 1 ) = 空白セルの番地、例えば、 ( 3 ,8 )
can ( j , 2 ) = 空白セルの行番号、 3
can ( j , 3 ) = 空白セルの列番号、 8
can ( j , 4 ) = 空白セルの属するブロック番号、例えば、中央ブロックは 5
can ( j , 5 ) = 候補の個数、 k 個とする。
can ( j , 6 ) = 一番目の候補、 a1
can ( j , 7 ) = 二番目の候補、 a2
・・・・・・・・・・・
can ( j , 5+k ) = k 番目の候補、 ak
can matrix に蓄えられる候補の digit は、1 から 9 までの digit の中で小さい数から順に k 個蓄えられるのがプログラム上のポイントである。
can matrix を使った M_search マクロの例を以下に示そう。
Sub M_search()
empty_cell = Sheets("Sheet1").Range("K2")
For i = 1 To empty_cell
If can(i, 5) = 1 Then
ii = can(i, 2)
jj = can(i, 3)
ak = can(i, 6)
If Sheets("Sheet1").Cells(ppp + ii, qqq + jj) <> "" Then GoTo contii
Sheets("Sheet1").Cells(ppp + ii, qqq + jj) = ak
numa = numa + 1
Sheets("Sheet6").Cells(numa + 17, 1) = numa - 1
Sheets("Sheet6").Cells(numa + 17, 2) = "(" & ii & "," & jj & ")"
Sheets("Sheet6").Cells(numa + 17, 3) = ak
Sheets("Sheet6").Cells(numa + 17, 4) = sch
Sheets("Sheet6").Cells(numa + 17, 21) = 0.01 * (Int(100 * (Timer - timer0)))
Sheets("Sheet6").Range("A18") = numa - 1
End If
contii:
Next i
End Sub
M_search の「候補を一つしか持たないセル」は、 can ( j , 5 )= 1 と簡単にあらわすことができるので、マクロの中で四行目だけが重要である。あとは何番目に見つかったかや、その番地や数字、その探索法と時間を記録しているだけである。
2009年9月17日木曜日
(46) 感激の日に遭遇
2006年8月15日(火) 数独を知ってから、初めての感激の日に遭遇した。これまでのプログラミングの長い経験から、構成が固まってからプログラミングに入るまで出来るだけ時間を取るように心がけている。この辛抱が結局、ミスを少なくする秘訣であると体得した。またプログラミングを書くのは、パソコンで一気にやるのだが、はやる気持ちを抑えて、ゆっくりと間違いがないように進めるようにしている。一度犯したミスは同じ人が何回見直しても見過ごしてしまうことが多い。長年の経験でわかっていることは、一字間違ったところを、その時なら一度見直すだけで済むものが、日をおくと、何時間いや何日も費やしてしまうことがある。とにかく、はやる気持ちを抑えて、順に、順に進めていくのがポイントである。
朝から number_table のプログラミングを見直した。昨夜、やったのに、僅かにバグがあった。 pj のところが pi になっていたのだ。 また、 g-matrix を gg と gl と gc の三つの三次元 matrix でやることにした。
number_table が完成すると P サーチや S サーチは簡単にできあがった。(後述) これで流して見ると、ニコリ名品100題が 4分53秒 またポケット数独上級編が 6分11秒 と驚くべき速さを記録した。まだ、この三つの探索法しか使っていないのにだ!
朝から number_table のプログラミングを見直した。昨夜、やったのに、僅かにバグがあった。 pj のところが pi になっていたのだ。 また、 g-matrix を gg と gl と gc の三つの三次元 matrix でやることにした。
number_table が完成すると P サーチや S サーチは簡単にできあがった。(後述) これで流して見ると、ニコリ名品100題が 4分53秒 またポケット数独上級編が 6分11秒 と驚くべき速さを記録した。まだ、この三つの探索法しか使っていないのにだ!
(45) ナンプレVBA解法に新展開
定期試験の成績報告やオープン・キャンパスなどあわただしい日々が過ぎ、和歌山ソフトウエアコンテストの応募受付開始まであと20日ばかりを残すまでとなり、夏休みの日を迎えることになった。メモ(44)に到達するまでの当時の経緯を日記から拾い出して見よう。
2006年8月14日(月) 数独の手筋を整理しようといろいろ考えていると、candy table に対して、number table というのを作成した方が手筋を表しやすいのではないかと思いつき、それが、これまでやってきたことを基本から覆すような、どでかい発想であるのではないかと思えた。数独のVBA解法というマニアックな分野の中で、このようなモデル化で、ここまでたどり着いているのは、日本中で、いや世界中でも数少ないのではないかという気がしてきた。
まず、 candy table を Excel 画面上に作成するのではなく、matrix で表現することを考え、そのプログラムをかき成功した。おかげで画面がちらちらすることはなくなり、計算時間も画期的に早くなった。
2006年8月14日(月) 数独の手筋を整理しようといろいろ考えていると、candy table に対して、number table というのを作成した方が手筋を表しやすいのではないかと思いつき、それが、これまでやってきたことを基本から覆すような、どでかい発想であるのではないかと思えた。数独のVBA解法というマニアックな分野の中で、このようなモデル化で、ここまでたどり着いているのは、日本中で、いや世界中でも数少ないのではないかという気がしてきた。
まず、 candy table を Excel 画面上に作成するのではなく、matrix で表現することを考え、そのプログラムをかき成功した。おかげで画面がちらちらすることはなくなり、計算時間も画期的に早くなった。
2009年8月24日月曜日
(39) アート・ナンプレの提唱
SUDOKU_Ver20 では、16×16 (block 4×4)サイズ数独を作成した。このとき、さらに大規模な 25×25 (block 5×5) の数独、更に大きな数独にも対応できるように、Sheet の割り振りを考えていたので、SUDOKU_Ver23 (25×25 対応)は、マクロ group_search を変更するだけで、簡単に作成できた。
さらに、変形block ナンプレ、12×12 (Block 3×4 )や28×28 (Block 4×7)もマクロを一つ変えるだけで難なく作成することができた。(SUDOKU_Ver24)
大規模数独になると、問題を解く手順や解法を見つける楽しみにもまして、根気や忍耐力で問題に取り組み、やり遂げる達成感というより、苦しみと戦うマゾ的 要素が加わる。パソコンソフトでなら何でもないことが、人間が取り組むとなると莫大な時間と強靭な気力が必要になる。逆に、コンピュータで解くには多少の物足りなさを感じる。
問題を作る方も大規模数独となると大変なのであろうと推察する。(作ったことがないからわからないが) 数独問題の唯一解の特性だけを考慮すれば、ある問題では、第一手から final answer に至るまでの各ステップが問題になりえる。また、一つの問題でも、数字交換(1から9までの数字を交換する方法、これだけでも 9! 通りの同じ問題ができる)、Block 毎の行交換、列交換、各行または各列の Block 内交換、さらには8種類の対称交換(後述)を行っても、問題の本質は変わらないから事実上無限個の同一種類の問題が存在する。
このようなことを考えながら大規模数独の面白さを引き出すひとつの方法として、「アート・ナンプレ」というのがあったら面白いのではと思った。ニコリ社の数独では、数字の配列が対称であることというのを特徴にしているようだが、ナンプレの問題での数字の配置が何かの形をなぞらえていたり、final answer の状態での数字の配列が「お絵かきロジック」のように、アートになっているといった類のものである。数独の新しい分野として考えられるのではないかとおもった。詰将棋の分野でも、手順を楽しむのと別にその奇抜な形の不思議を楽しむのがあったように記憶している。
さらに、変形block ナンプレ、12×12 (Block 3×4 )や28×28 (Block 4×7)もマクロを一つ変えるだけで難なく作成することができた。(SUDOKU_Ver24)
大規模数独になると、問題を解く手順や解法を見つける楽しみにもまして、根気や忍耐力で問題に取り組み、やり遂げる達成感というより、苦しみと戦うマゾ的 要素が加わる。パソコンソフトでなら何でもないことが、人間が取り組むとなると莫大な時間と強靭な気力が必要になる。逆に、コンピュータで解くには多少の物足りなさを感じる。
問題を作る方も大規模数独となると大変なのであろうと推察する。(作ったことがないからわからないが) 数独問題の唯一解の特性だけを考慮すれば、ある問題では、第一手から final answer に至るまでの各ステップが問題になりえる。また、一つの問題でも、数字交換(1から9までの数字を交換する方法、これだけでも 9! 通りの同じ問題ができる)、Block 毎の行交換、列交換、各行または各列の Block 内交換、さらには8種類の対称交換(後述)を行っても、問題の本質は変わらないから事実上無限個の同一種類の問題が存在する。
このようなことを考えながら大規模数独の面白さを引き出すひとつの方法として、「アート・ナンプレ」というのがあったら面白いのではと思った。ニコリ社の数独では、数字の配列が対称であることというのを特徴にしているようだが、ナンプレの問題での数字の配置が何かの形をなぞらえていたり、final answer の状態での数字の配列が「お絵かきロジック」のように、アートになっているといった類のものである。数独の新しい分野として考えられるのではないかとおもった。詰将棋の分野でも、手順を楽しむのと別にその奇抜な形の不思議を楽しむのがあったように記憶している。
2009年8月20日木曜日
(38) 難易度レベルと脳力シミュレーション
SUDOKU_Ver.21 はVer.18 の改変し、いくつかの新しい機能を追加した。
まず、空白セルの数字が決定される毎に、計算時間( elapse time )をアウトプットするようにした。同時に使用した探索法も分かっているので、パソコンでの使用時間と関連づけて、数独を人間が解くに要する時間により脳力シミュレーションができないかと考えた。例えば、Pサーチは1.0、Mサーチは1.5、Gサーチは4という風に重みをつけ、人間の解く時間とそのプロセスを比較すれば、何らかの脳力検定ができるのではないかということである。
このソフトでは、数独問題を途中人の手を介さず、自動連続計算することにしているので、計算結果の一覧表を Sheet 3 に表記するように、 arrangement_result_to_sheet3 のマクロを新設した。また、一問別の計算結果情報(計算過程の手順など)を一枚のシートに移す transfer_arranged_data マクロを追加した。
数独解のプロセスとElapse time を示すグラフを追加した。このグラフより、問題を解く過程における問題の特性(解き味?)が一目瞭然とわかる。
数独問題のレベルと探索法との関係がわかるレベル評価の方法を模索した。今のところ使用できる探索法は限られているので( P, S, G, Q, M, C, V, X ) 、Aサーチの回数を表わす klevel の値により、例えば klevel=0 の場合は、「Easy」とし、klevel<=2 の場合、「Medium」のように、6段階に分けた。
まず、空白セルの数字が決定される毎に、計算時間( elapse time )をアウトプットするようにした。同時に使用した探索法も分かっているので、パソコンでの使用時間と関連づけて、数独を人間が解くに要する時間により脳力シミュレーションができないかと考えた。例えば、Pサーチは1.0、Mサーチは1.5、Gサーチは4という風に重みをつけ、人間の解く時間とそのプロセスを比較すれば、何らかの脳力検定ができるのではないかということである。
このソフトでは、数独問題を途中人の手を介さず、自動連続計算することにしているので、計算結果の一覧表を Sheet 3 に表記するように、 arrangement_result_to_sheet3 のマクロを新設した。また、一問別の計算結果情報(計算過程の手順など)を一枚のシートに移す transfer_arranged_data マクロを追加した。
数独解のプロセスとElapse time を示すグラフを追加した。このグラフより、問題を解く過程における問題の特性(解き味?)が一目瞭然とわかる。
数独問題のレベルと探索法との関係がわかるレベル評価の方法を模索した。今のところ使用できる探索法は限られているので( P, S, G, Q, M, C, V, X ) 、Aサーチの回数を表わす klevel の値により、例えば klevel=0 の場合は、「Easy」とし、klevel<=2 の場合、「Medium」のように、6段階に分けた。
2009年8月18日火曜日
(37) 大型数独への展開 (16×16 数独)
先に購入した雑誌「ナンプレ・ファン」には、9×9 の数独(ノーマルナンプレと呼ぼう)の他に拡張したナンプレ(16×16 や 25×25 )問題が掲載されている。SUDOKU_Ver19 では、16×16 ナンプレ専用のプログラムを考えてみた。
コンピュータ・ソフトの特徴は、大規模化にもかかわらず、正確さと計算時間が人間の能力をはるかに上回るその馬鹿さ加減にある。アルゴリズムは同じなのだから、簡単に大規模化には対応できるものであると考えてやってみた。
実際には、簡単に拡張ソフトにはすることができたが、そのソフト自体の設計およびアルゴリズムの特徴により細かいところで、いくつかの変更を必要とした。これは、最初からこういう事態を想定していなかったための問題に起因するもので、アルゴリズムが違えばもっと手数は掛からないのかもしれない。
(1) 計算はSheet 1 の A画面 とのやり取りから始まる。A画面の拡張により、candy_table の表示部分を移す必要があった。
(2) 問題の入力(Sheet 3)におけるセルの調整。
(3) 解答の表示場所を新たに確保すること。 などである。
(4) 探索マクロは、1から9 を 1から Z に変更し、Z=16 をSheet 1 のインプットで与える。これで、Z=25 にも対応できる。今回の拡張では、さらに大規模のものまで対応できるように考慮した。
(5) 特に、Aサーチの new_class_search では変更箇所が多く面倒であった。
(6) 当然、group_search や iblock_search なども範囲の拡大をおこなった。
今回の拡張で、セルの番地 ( i , j ) の取り出しで新しいマクロ row_column_number を作成した。このマクロを使えば、81×81 ナンプレまで対応できる。つまり、9×9 は一桁で済んだが、二桁になるとちょっと取り出すのに工夫がいるので、その簡単なマクロを下に示そう。
Sub row_column_number()
If Len(cc) = 5 Then
aa = Int(Val(Mid(cc, 2, 1))) : bb = Int(Val(Mid(cc, 4, 1)))
ElseIf Len(cc) = 6 Then
If Mid(cc, 3, 1) = "," Then
aa = Int(Val(Mid(cc, 2, 1))) : bb = Int(Val(Mid(cc, 4, 2)))
ElseIf Mid(cc, 4, 1) = "," Then
aa = Int(Val(Mid(cc, 2, 2))) : bb = Int(Val(Mid(cc, 5, 1)))
End If ElseIf Len(cc) = 7 Then
aa = Int(Val(Mid(cc, 2, 2))): bb = Int(Val(Mid(cc, 5, 2)))
Else MsgBox ("Banchi is mismatching!")
End If
End Sub
番地から、行・列番号が必要なときには、次のように使う。
row_column_number
i=aa : j=bb
100×100 ナンプレにも同じようなマクロが作れるが、まだ試してはいない。
49×49ナンプレはその後問題があったので、解いてみたがインプットに時間が掛かる割には簡単にとけた。一般に大規模ナンプレはPサーチだけで解ける簡単な(コンピュータには)問題が多いようだ。人間には手に負えないというか忍耐力だけを試すことになってしまうためなのか。
コンピュータ・ソフトの特徴は、大規模化にもかかわらず、正確さと計算時間が人間の能力をはるかに上回るその馬鹿さ加減にある。アルゴリズムは同じなのだから、簡単に大規模化には対応できるものであると考えてやってみた。
実際には、簡単に拡張ソフトにはすることができたが、そのソフト自体の設計およびアルゴリズムの特徴により細かいところで、いくつかの変更を必要とした。これは、最初からこういう事態を想定していなかったための問題に起因するもので、アルゴリズムが違えばもっと手数は掛からないのかもしれない。
(1) 計算はSheet 1 の A画面 とのやり取りから始まる。A画面の拡張により、candy_table の表示部分を移す必要があった。
(2) 問題の入力(Sheet 3)におけるセルの調整。
(3) 解答の表示場所を新たに確保すること。 などである。
(4) 探索マクロは、1から9 を 1から Z に変更し、Z=16 をSheet 1 のインプットで与える。これで、Z=25 にも対応できる。今回の拡張では、さらに大規模のものまで対応できるように考慮した。
(5) 特に、Aサーチの new_class_search では変更箇所が多く面倒であった。
(6) 当然、group_search や iblock_search なども範囲の拡大をおこなった。
今回の拡張で、セルの番地 ( i , j ) の取り出しで新しいマクロ row_column_number を作成した。このマクロを使えば、81×81 ナンプレまで対応できる。つまり、9×9 は一桁で済んだが、二桁になるとちょっと取り出すのに工夫がいるので、その簡単なマクロを下に示そう。
Sub row_column_number()
If Len(cc) = 5 Then
aa = Int(Val(Mid(cc, 2, 1))) : bb = Int(Val(Mid(cc, 4, 1)))
ElseIf Len(cc) = 6 Then
If Mid(cc, 3, 1) = "," Then
aa = Int(Val(Mid(cc, 2, 1))) : bb = Int(Val(Mid(cc, 4, 2)))
ElseIf Mid(cc, 4, 1) = "," Then
aa = Int(Val(Mid(cc, 2, 2))) : bb = Int(Val(Mid(cc, 5, 1)))
End If ElseIf Len(cc) = 7 Then
aa = Int(Val(Mid(cc, 2, 2))): bb = Int(Val(Mid(cc, 5, 2)))
Else MsgBox ("Banchi is mismatching!")
End If
End Sub
番地から、行・列番号が必要なときには、次のように使う。
row_column_number
i=aa : j=bb
100×100 ナンプレにも同じようなマクロが作れるが、まだ試してはいない。
49×49ナンプレはその後問題があったので、解いてみたがインプットに時間が掛かる割には簡単にとけた。一般に大規模ナンプレはPサーチだけで解ける簡単な(コンピュータには)問題が多いようだ。人間には手に負えないというか忍耐力だけを試すことになってしまうためなのか。
2009年8月17日月曜日
(36) Ver.18 で大改造する。
SUDOKU_Ver18 でプログラムの構成方法とマクロの組み立てを大幅に改変した。大きくは、探索方法の種類が増えたこと、その役割が何となくはっきりしてきたからである。
まず、 part_search_table を廃止して、 candy_table のみとする。流れとしては、(A) candy_table の後、P, M, S, Q, V, などのサーチをする。 (B) refine_candy_table の後の P, S, Mサーチ(PR,MRなど) (C) two_candidate_search (A サーチ ) といった流れとなる。
数独の解法の過程を考えてみると、空白セルの数字を決定するのは、あくまでも基本サーチだけである。その他のサーチでは、「候補になる可能性がない」ことにより候補から外されるだけで、結果として、その影響により、他のセルの候補の数字が single candidate になり、基本サーチにより数字が決定される。つまり、基本サーチ以外の探索法では、candy_table を書き換えて、 refine_candy_table を作るだけのことである。このことは、マクロの書き方にも関係してくることである。今のやり方では、これまでに決定された数字を含めた A画面より candy_table が作られる。もし、refine_candy_table のあとの基本サーチでA 画面が変わらなければ、折角のサーチが無駄になってしまうのだ。
もう一つの大きな改変は、candy_table を作るとき、各blockのなかで、空白セルの数字の数(anum) を探すやり方で candidate をさがしていた。新しいやり方では、数字(numb)を1から9まで回して candidate を決定する方法である。この方法の採用により、計算時間は大幅に短縮された。
まず、 part_search_table を廃止して、 candy_table のみとする。流れとしては、(A) candy_table の後、P, M, S, Q, V, などのサーチをする。 (B) refine_candy_table の後の P, S, Mサーチ(PR,MRなど) (C) two_candidate_search (A サーチ ) といった流れとなる。
数独の解法の過程を考えてみると、空白セルの数字を決定するのは、あくまでも基本サーチだけである。その他のサーチでは、「候補になる可能性がない」ことにより候補から外されるだけで、結果として、その影響により、他のセルの候補の数字が single candidate になり、基本サーチにより数字が決定される。つまり、基本サーチ以外の探索法では、candy_table を書き換えて、 refine_candy_table を作るだけのことである。このことは、マクロの書き方にも関係してくることである。今のやり方では、これまでに決定された数字を含めた A画面より candy_table が作られる。もし、refine_candy_table のあとの基本サーチでA 画面が変わらなければ、折角のサーチが無駄になってしまうのだ。
もう一つの大きな改変は、candy_table を作るとき、各blockのなかで、空白セルの数字の数(anum) を探すやり方で candidate をさがしていた。新しいやり方では、数字(numb)を1から9まで回して candidate を決定する方法である。この方法の採用により、計算時間は大幅に短縮された。
2009年8月7日金曜日
(34) 基本系 Sサーチの発見
2006年7月21日(金) イオン旭屋書店にて、「ナンバープレース40号記念号」という数独の雑誌を買った。これを見ていると突然 Sサーチというのを思いついた。これまで漠然と数字を決定するのはPサーチとMサーチの二つの基本系ばかりに目を奪われていたのだが、Block と同様にColumn(列) と Row(行)も同様の役割を果たすのだ。つまりBlock, Column, Row は対等でBlock で考ええる手法はColumn や Row でも同等に成立するし、一つのセルはどのセルも、そしてすべてのセルが、ひとつのBlock , 一つのColumn そしてひとつのRow に属するということである。
目からうろことはこの事か。乙女の姿がよく見るとおばあさんの顔にも見えるという「隠し絵」のように、Pサーチとおもっていたのが、実はSサーチでも解けるということがわかった。(ニコリ数独名品100選
の初級パターン①から⑤は、すべてPサーチであると同時にSサーチでもあるのだ。純粋にPサーチであるのは初級パターン④だけである。)
この発見により、数独の基本手順は4通りに分類できることがわかった。基本系とはその手順だけで、数字が決定する手順のことである。そこで、プログラムの書き換えを行い、かつ探索法の名前の変更をおこなった。
Bサーチ(Pサーチ) あるBlock の中で入るセルが一つしかない数字を探す。
Lサーチ(Sサーチ) ある 行 の中で入るセルが一つしかない数字を探す。
Cサーチ(Sサーチ) ある 列 の中で入るセルが一つしかない数字を探す。
Mサーチ(Mサーチ) ひとつの候補しか持たないセルを探す。
目からうろことはこの事か。乙女の姿がよく見るとおばあさんの顔にも見えるという「隠し絵」のように、Pサーチとおもっていたのが、実はSサーチでも解けるということがわかった。(ニコリ数独名品100選
の初級パターン①から⑤は、すべてPサーチであると同時にSサーチでもあるのだ。純粋にPサーチであるのは初級パターン④だけである。)
この発見により、数独の基本手順は4通りに分類できることがわかった。基本系とはその手順だけで、数字が決定する手順のことである。そこで、プログラムの書き換えを行い、かつ探索法の名前の変更をおこなった。
Bサーチ(Pサーチ) あるBlock の中で入るセルが一つしかない数字を探す。
Lサーチ(Sサーチ) ある 行 の中で入るセルが一つしかない数字を探す。
Cサーチ(Sサーチ) ある 列 の中で入るセルが一つしかない数字を探す。
Mサーチ(Mサーチ) ひとつの候補しか持たないセルを探す。
2009年8月6日木曜日
(33) Ver.16(ポケット数独)の開発
2006年7月17日(月) 和歌山近鉄百貨店のとなりの本屋で、ニコリ社から最近発売された「ポケット数独」の初級版と中級版を購入、SUDOKU_Ver.16 の新しいシートに入力した。新しい解法として、refine_special_search_table を作成した。数独の解法において著しい進歩があった。
実際に人間が数独を解く場合どのような順序で探して、考えるのだろうかと思いをめぐらした。初級の問題では、表出数(givens)の多い数字から「平行線の常識」(つまりPサーチ)で single candidate のセルを見つけ、同じ数字をしつこく追いかける。これで初級問題は大体とける。パソコンでは、candy table を作るから、「残り物の常識」(Mサーチ)が一番さきに分かりやすい。これが将来 g_matrix となる。
実際に人間が数独を解く場合どのような順序で探して、考えるのだろうかと思いをめぐらした。初級の問題では、表出数(givens)の多い数字から「平行線の常識」(つまりPサーチ)で single candidate のセルを見つけ、同じ数字をしつこく追いかける。これで初級問題は大体とける。パソコンでは、candy table を作るから、「残り物の常識」(Mサーチ)が一番さきに分かりやすい。これが将来 g_matrix となる。
2009年8月5日水曜日
(32) ナンプレの雑誌・本を買う。
2006年7月15日(土) 本屋に行ったら、ナンプレの雑誌がたくさん並んでいた。そこで「ナンプレ・ファン」という雑誌を買った。通常のナンプレのほかに対角線ナンプレとか幾何学ナンプレとかいう種類のナンプレがあり、どういう風にマクロを変更すればこれらのナンプレに対応できるのかを考えた。
通常のナンプレもファーストステージからサードステージまで、レベルごとのたくさんのナンプレがのっていた。順番に解いてみたが、最初の方は簡単すぎて面白くなかった。
2006年7月16日(日) 本屋さんでまた400円の雑誌をかった。これも簡単すぎて手ごたえがなかった。「MR」と同じような手筋で「PR」というマクロをつくった。これは、refine_search_table の中の single value を抽出するものである。single candidate を抽出する「MR」と対をなすものだと思うが、V, B, Q サーチとの関係を調べておく必要がある。あまりにも多くのアイディアが次から次へと思い浮かぶので整理しておかないと自分でも分からなくなるのではと心配である。
通常のナンプレもファーストステージからサードステージまで、レベルごとのたくさんのナンプレがのっていた。順番に解いてみたが、最初の方は簡単すぎて面白くなかった。
2006年7月16日(日) 本屋さんでまた400円の雑誌をかった。これも簡単すぎて手ごたえがなかった。「MR」と同じような手筋で「PR」というマクロをつくった。これは、refine_search_table の中の single value を抽出するものである。single candidate を抽出する「MR」と対をなすものだと思うが、V, B, Q サーチとの関係を調べておく必要がある。あまりにも多くのアイディアが次から次へと思い浮かぶので整理しておかないと自分でも分からなくなるのではと心配である。
2009年8月3日月曜日
(31) 公開されているナンプレの解法
2006年7月11日 インターネットでナンプレ(数独)の解法なるものを検索した。これまで数独単行本の最初にのっている「解き方のガイド」なるものを参考にしてきたが、できるだけ自力で解法を見つけようとする方針というか性格であるので意識して独創的な解法をめざしてきたのだ。しかし、その解法は見つからないままAサーチに頼るという道を歩み始めた。真似はしなくとも独創性は発揮できることに気づいて、解法を体系的に論じたものがないかと思った。結果はなかった。というか見つからなかった。解法のいろいろな技術的方法は少し形は違うがにたようなものはたくさんあるが、理論的分類のようなのもはみつからなかった。
「ナンバープレース解法教室」(藤原)には一番分かりやすく、解法の種類も豊富である。「平行線の常識」とか解法のネーミングもユニークである。少なくともこれらの解法はマクロに加えるべきであろうと思った。ただし、どれが重要なものか、頻度が高いのかなどは、数独を実際に解いたことのないものにはわからなかった。わたしはいまでも、ほんのビギナーの問題しかとくことが出来ないのである。その理由は自分が一番よく知っている。恐ろしくせっかちで、数独を解く根気にかけているのである。
インターネットでさらに調べると、すでに数独ソルバーなるものはいくつもあるらしい。どんなものか分からないが、連続で全自動というのはないだろうとおもった。現在、開発中のものには、解法とレベルをうまく組合すと、これまでにないユニークな数独ソフトができあがるだろうと楽観した。
和歌山ソフトウエアーコンテストの締め切りまで、あと二ヶ月もあるので、新しい手筋を3つばかりは付け加えるようにしようと決心した。
「ナンバープレース解法教室」(藤原)には一番分かりやすく、解法の種類も豊富である。「平行線の常識」とか解法のネーミングもユニークである。少なくともこれらの解法はマクロに加えるべきであろうと思った。ただし、どれが重要なものか、頻度が高いのかなどは、数独を実際に解いたことのないものにはわからなかった。わたしはいまでも、ほんのビギナーの問題しかとくことが出来ないのである。その理由は自分が一番よく知っている。恐ろしくせっかちで、数独を解く根気にかけているのである。
インターネットでさらに調べると、すでに数独ソルバーなるものはいくつもあるらしい。どんなものか分からないが、連続で全自動というのはないだろうとおもった。現在、開発中のものには、解法とレベルをうまく組合すと、これまでにないユニークな数独ソフトができあがるだろうと楽観した。
和歌山ソフトウエアーコンテストの締め切りまで、あと二ヶ月もあるので、新しい手筋を3つばかりは付け加えるようにしようと決心した。
2009年8月2日日曜日
(30) Aサーチ(仮定法)の候補の選択方法
Sudoku_Ver.14 において、新しく購入した「激辛1」の衝撃の105問を、Sheet12のインプット・シートとして使う。(isheet) Sheet13 は dsheet (解答シート)とする。
A サーチは二つの候補を持つセルを選び、そのうちの一つを仮定して先の計算を進める。どちらかが正解なのだが、選びようによっては、また仮定する必要がでてくる。プログラムでは、5階層まで扱えるようにはなっているが、計算時間が掛かったり、答えに至らない場合がある。
そこで、二つの候補をもつセルの選び方を変えてその状況を調べてみた。正回転はBlock 1 から最初に出てきたセルを選択、逆回転とは、Block 9 から逆に探し出したセルから取り出す。中央回転とは、empty_cell の真ん中から最初のものをとる場合である。
「激辛 Vol.3」の問題を例にとり、試してみた結果は次の通りである。
正回転 逆回転 中央回転
問題 32番 47 19 7
問題 35番 9 57 52
問題 44番 27 - 61
問題 68番 28 - 24
問題 70番 58 22 29
問題 80番 31 68 19
問題 90番 15 80 12
問題 99番 65 - 60
問題 100番 - 18 10
問題 104番 61 25 48
ここに、「-」は解が得られなかったもの(5階層以上)である。
仮定法において、どのセルの候補を選ぶと効率よく解がえられるかはまだ理論はない。
A サーチは二つの候補を持つセルを選び、そのうちの一つを仮定して先の計算を進める。どちらかが正解なのだが、選びようによっては、また仮定する必要がでてくる。プログラムでは、5階層まで扱えるようにはなっているが、計算時間が掛かったり、答えに至らない場合がある。
そこで、二つの候補をもつセルの選び方を変えてその状況を調べてみた。正回転はBlock 1 から最初に出てきたセルを選択、逆回転とは、Block 9 から逆に探し出したセルから取り出す。中央回転とは、empty_cell の真ん中から最初のものをとる場合である。
「激辛 Vol.3」の問題を例にとり、試してみた結果は次の通りである。
正回転 逆回転 中央回転
問題 32番 47 19 7
問題 35番 9 57 52
問題 44番 27 - 61
問題 68番 28 - 24
問題 70番 58 22 29
問題 80番 31 68 19
問題 90番 15 80 12
問題 99番 65 - 60
問題 100番 - 18 10
問題 104番 61 25 48
ここに、「-」は解が得られなかったもの(5階層以上)である。
仮定法において、どのセルの候補を選ぶと効率よく解がえられるかはまだ理論はない。
2009年7月25日土曜日
(29) Ver.13 で全「激辛」を一応征服した。
SUDOKU Ver.13 は2006年6月27日に着手、 refine_search_table を使用して search_table の候補の中から、
① 二つのセルで二つの候補が同じため、同blockのたのセルでは使えない数字や
② 他のblockの同行、同列に、二つのセルのみ candidate を二つ持つセルがあるのでこれは使われないとき、
これらの候補を消去して、候補数を絞った新しい表を作成する。
また、どの検索が有効であるかを見るための ON OFF 機能を追加する。
また、refine_M_search を新設、候補が一つしかないセルを満たす「MR」として区別した。
これらの改良により、激辛 Vol.1~Vol.3 をすべてクリアした。
① 二つのセルで二つの候補が同じため、同blockのたのセルでは使えない数字や
② 他のblockの同行、同列に、二つのセルのみ candidate を二つ持つセルがあるのでこれは使われないとき、
これらの候補を消去して、候補数を絞った新しい表を作成する。
また、どの検索が有効であるかを見るための ON OFF 機能を追加する。
また、refine_M_search を新設、候補が一つしかないセルを満たす「MR」として区別した。
これらの改良により、激辛 Vol.1~Vol.3 をすべてクリアした。
2009年7月8日水曜日
(27) V サーチを追加
Ver12 の激辛2 では 100題中 15題が Not Conquer となった。これは、まだまだ探索法が少なく、A サーチにのみ頼っているためで、人間の思考にははるかに及ばないことの証拠であろう。これからは、人間の思考に近い探索法をマクロにすることに心がけよう。その手始めに、新しい探索法である gloval_victory_search マクロを作成した。現在の V_search に相当し、「VL」と「VC」からなる。
V_search の探索法
① igrp でブロック順に空白セルにいる候補を調べる。
② 数字を numb=1 から 9 まで順番に調べる。ここに、numb はセルに候補として入る数字をあらわす。
③ igrp の中で、numbの候補の数を調べる。もしこれが 一つしかなかったら、Pサーチで求まる決定値に相当する。各ブロックで numbの数を数えて num とする。 num=2 であれば、( i1 , i2 )=a1 , ( j1 ,j2 ) =b1=numb として二つだけの候補が求まる。
④ igrp の同行 i1=j1 または 同列 i2=j2 の他のセルには数字 numb ははいりえないので、もし他のblock の同行、同列に numbがあれば、それを除外する。結果として、除外したセルの属する block で、numb の入るセルが一つあれば、そのセルはnumbとなり、数字が確定する。
V_search の探索法
① igrp でブロック順に空白セルにいる候補を調べる。
② 数字を numb=1 から 9 まで順番に調べる。ここに、numb はセルに候補として入る数字をあらわす。
③ igrp の中で、numbの候補の数を調べる。もしこれが 一つしかなかったら、Pサーチで求まる決定値に相当する。各ブロックで numbの数を数えて num とする。 num=2 であれば、( i1 , i2 )=a1 , ( j1 ,j2 ) =b1=numb として二つだけの候補が求まる。
④ igrp の同行 i1=j1 または 同列 i2=j2 の他のセルには数字 numb ははいりえないので、もし他のblock の同行、同列に numbがあれば、それを除外する。結果として、除外したセルの属する block で、numb の入るセルが一つあれば、そのセルはnumbとなり、数字が確定する。
2006年6月27日にこのマクロが完成し、激辛2の15題あった Not Conquer は96,97,99,103の四つになった。計算時間も 8.7分に短縮された。
2009年7月6日月曜日
(26) 激辛数独2を購入
SUDOKU_Ver12 のSheet 8 およびSheet9に、2006年6月17日に購入した「激辛数独2」の入力を開始、6月20日までかかった。解けない問題が多々あり、問題を今一度見直して見るとインプットミスが多い。数字は一行ずれていたり、一番多いのは、数字の入れ忘れである。その他 Excel VBA に関していくつかの奇妙な現象に遭遇した。まだまだ未熟な点が多いなあ。
SUDOKU_Ver12 ではいくつかの改良を行った。これまで空白セル毎に i=1 to 9 , j=1 to 9 で回していたのだが、 igrp (ブロック番号)で回すように、block_search を新しく採用した。
Ver12 で決定版数独は、64、70、80、113、116、118 の六つの Not Conquer があり、時間は 8.95分を記録した。また名品100選では、45、54、75、91 の五つの Not Conquer があり、時間は 9.33分に短縮された。
SUDOKU_Ver12 ではいくつかの改良を行った。これまで空白セル毎に i=1 to 9 , j=1 to 9 で回していたのだが、 igrp (ブロック番号)で回すように、block_search を新しく採用した。
Ver12 で決定版数独は、64、70、80、113、116、118 の六つの Not Conquer があり、時間は 8.95分を記録した。また名品100選では、45、54、75、91 の五つの Not Conquer があり、時間は 9.33分に短縮された。
登録:
投稿 (Atom)