数独(ナンプレ)パズルの解析ソフト
はじめに
いま全世界で人気沸騰中の「数独パズル」のソルバーです。
(参考:鍛冶真起 文芸春秋6月号「数独」パズル世界を制す)
数独のルールは超簡単で次の二つです。
(1)タテ9列、ヨコ9行のそれぞれに1~9の数字が一つずつ入る。
(2)太枠で囲まれたブロックにも1~9の数字が一つずつ入る。
解き方も基本は、
①「数字の入る場所が一つしかないセル」を特定することと
②「候補の数字を一つしか持たないセル」をさがすことです。
①の解法では、ブロックの中で一つのセルにしか入れない数字を探す方法
(「B」サーチと呼ぶ)と行や列の中で探す方法(それぞれ「L]サーチおよび
「C]サーチと呼ぶ)があります。
②の解法(「M」サーチとよぶ)は解法としては基本なのですが、実際には
①より探しにくいためか高くレベル付けされているのもあります。(100選26番)
ニコリ名品100選には、Bサーチだけで解ける問題が30題もあります。
このレベルを「Beginner」となづけました。 この4つの基本サーチだけで
解ける問題が70題ありました。レベル的にはVery Easy が16題、Easy が
24題の内訳です。残った30題をスラスラ解けるのをソフト開発の目標にした
結果、この100題を2分34秒で解くことができました。
本解析ソフトでは、これら4つの基本解法に加え、15の解法を使ってどんな
難問であっても解くことができます。早く解くことが目的ではないのですが、
ある程度問題の難易度を推定することができるので、難問ナンプレを数冊
解いてみた結果、次のようになりました。
ポケット数独上級篇 (105題) 3分10秒
激辛数独 3 (105題) 3分36秒
ナンプレ超上級編 11 (101題) 5分37秒
難問ナンプレに挑戦 2 (101題) 7分50秒
西尾徹也のナンプレBS 100 (100題) 3分23秒
これまで、数独のどの雑誌やどの本にも最終的な解答はあるものの行き
詰まったとき、どんな解法で、どこに目をつけて進めばよいのかをヒント
として与えているものを見かけたことがありません。
本解析ソフトでは独自の方法でその手順と解法の表現法を実現しました。
そして問題着手から征服までに遭遇するポイント(次の一手)とそのタイミング
が一目瞭然にわかり解答者の達成感(挫折感?)を浮き彫りにします。
また、これまで解答者の技量と感覚に頼っていた難易度レベルの評価に
ついても、使用する解法の種類と特徴から判定する独自の手法を提案して
いるので、問題作成者にとっても一助となることが期待できます。
解析理論は独自に考案した画期的な手法を使用しています。Candidate
matrix(空白セルの数字の候補の集合を貯える行列)とブロック、行と列の
3種類のg-matrix(数字の入るセルの集合を貯えた3次元行列)を車の両輪
のごとく使い解法のプログラミング化を達成しました。
この理論の構築なくして、この効率のよいソフトの開発はなかったといえます。
使用している探索法を一覧表にまとめました。
表中には本などで紹介されている解法と本解法との関係も示しておきました。
本ソフトはノーマル・ナンプレ(9×9)に対応するものですが、拡大ナンプレ
(16×16、25×25、49×49)用にも容易に変更可能です。また変形ナンプレ
(対角線ナンプレ、幾何学ナンプレ、合体ナンプレなど)にも簡単に改良できます。
2009年9月30日水曜日
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月27日日曜日
(52) ソフコンのキャッチフレーズ
2006年第15回和歌山ソフトウエアコンテストの応募が 9月1日から始まる。応募作品はほぼ完成したが、そのプレゼン資料を作成するに当たって、何かキャッチフレーズが必要だと思っていた。つまり大学の研究室で何のためにこんなパズルのソフトを研究しているのか。学生用のVBAプログラミングの練習用への応用というのでは、如何にも説得力にかける。やはり、「(38)難易度レベルと脳力シミュレーション」で書いたように、人間の思考と関連させた方がよさそうだと考えて、「人間の思考過程や能力をコンピューターでシミュレート、数独パズルに挑戦!」とした。
コンピュータの計算結果の経過時間(Elapse Time)を縦軸にプロットしたグラフを描いてみると、pleasant や comfort の問題では、明らかにどの段階が問題の山場になっているのかが、グラフから読み取れた。学生に数独を解いてもらい、時間(Comsumed Time)も同時にメモしてもらった。パソコンで解いた結果と比較してみると、やさしい問題 (Beginner)ではその傾向は一致した。パソコンの性能にもよるが、おおよそパソコンの 400倍くらいの時間を要している。ただし、easy レベルからは、にわか仕込みの学生には無理であった。残念なことに数独のマニアはいなかったし、また、途中経過時間のデータも得られなかった。
コンピュータの計算結果の経過時間(Elapse Time)を縦軸にプロットしたグラフを描いてみると、pleasant や comfort の問題では、明らかにどの段階が問題の山場になっているのかが、グラフから読み取れた。学生に数独を解いてもらい、時間(Comsumed Time)も同時にメモしてもらった。パソコンで解いた結果と比較してみると、やさしい問題 (Beginner)ではその傾向は一致した。パソコンの性能にもよるが、おおよそパソコンの 400倍くらいの時間を要している。ただし、easy レベルからは、にわか仕込みの学生には無理であった。残念なことに数独のマニアはいなかったし、また、途中経過時間のデータも得られなかった。
2009年9月25日金曜日
(51) 難易度の判定
ナンプレの探索法による難易度評価について試案を考えた。
まず使用する探索法のレベルを次のように大まかな分類をする。
基本サーチ B , L , C , M
中級サーチ V , G , Q , P, U
上級サーチ T , R , S , H , W , Y , X , K , D
超上級サーチ A
通常、数独本には、問題毎に難易度が示されている。例えば、「ニコリ数独名品100選」では、Easy , Medium , Hard , Super Hard の 4 段階で、「西尾徹也のナンプレ Best Selection 100 」では、Beginner , Easy , Medium , Heavy , Super Heavy 」の 5 段階のごときである。
本ソフトに於いても、問題を解くのに必要な探索法の種類によって難易度を分類する8段階の評価法を採用した。
Beginner B
Very Easy B , L , C
Easy B , L , C , M
Plesant + V , G , Q , P , U
Comfort + T , R , S , H , W ,Y , X , K
Hard + A (1)
Very Hard + A (2)
Ultra Hard + A (3)
A サーチの括弧は、仮定する数字の数である。
数独本の難易度評価と本ソフトの評価の比較を次に示そう。
ニコリ数独名品100選 本ソフト
Easy 28 Beginner 30
Medium 27 Very Easy 16
Hard 32 Easy 24
Super Hard 13 Pleasant 8
合計 100 題 Comfort 15
Hard 4
Very Hard 0
Ultra Hard 3
西尾徹也の Best Selection 100 本ソフト
Beginner 5 Beginner 5
Easy 15 Very Easy 8
Medium 30 Easy 8
Heavy 30 Pleasant 21
Super Heavy 11 Comfort 41
合計 101題 Hard 6
Very Hard 8
Ultra Hard 4
まず使用する探索法のレベルを次のように大まかな分類をする。
基本サーチ B , L , C , M
中級サーチ V , G , Q , P, U
上級サーチ T , R , S , H , W , Y , X , K , D
超上級サーチ A
通常、数独本には、問題毎に難易度が示されている。例えば、「ニコリ数独名品100選」では、Easy , Medium , Hard , Super Hard の 4 段階で、「西尾徹也のナンプレ Best Selection 100 」では、Beginner , Easy , Medium , Heavy , Super Heavy 」の 5 段階のごときである。
本ソフトに於いても、問題を解くのに必要な探索法の種類によって難易度を分類する8段階の評価法を採用した。
Beginner B
Very Easy B , L , C
Easy B , L , C , M
Plesant + V , G , Q , P , U
Comfort + T , R , S , H , W ,Y , X , K
Hard + A (1)
Very Hard + A (2)
Ultra Hard + A (3)
A サーチの括弧は、仮定する数字の数である。
数独本の難易度評価と本ソフトの評価の比較を次に示そう。
ニコリ数独名品100選 本ソフト
Easy 28 Beginner 30
Medium 27 Very Easy 16
Hard 32 Easy 24
Super Hard 13 Pleasant 8
合計 100 題 Comfort 15
Hard 4
Very Hard 0
Ultra Hard 3
西尾徹也の Best Selection 100 本ソフト
Beginner 5 Beginner 5
Easy 15 Very Easy 8
Medium 30 Easy 8
Heavy 30 Pleasant 21
Super Heavy 11 Comfort 41
合計 101題 Hard 6
Very Hard 8
Ultra Hard 4
2009年9月24日木曜日
(50) ナンプレ探索法の開発
2006年8月下旬にかけて、can matrix , g matrix を使ったナンプレ探索法を一気に開発した。参考にした解法は当時の数独本に断片的に掲載されていたもので、下記に示す。
探索法はすでに述べた4つの基本サーチに加えて15個の探索法よりなっている。一つひとつの説明は省略するが、その全体の概要は次の通りである。
探索記号 マクロの名称 探索原理と公表されている解法
(文献は下記に示す)
B B_search あるBlockの中で入るセルが一つしかない数
字を探す。
初級パターン①②③④
point 1
平行線、水平線、垂直線の常識
直交平行線の常識
L L_search ある行の中で入るセルが一つしかない数字を
探す。
初級ショキュウパターン⑤
point 2
C C_search ある列の中で入るセルが一つしかない数字
を探す。
point 3
M M_search 一つしか候補をもたないセルを探す。
中級パターン④、⑤
上級パターン②
point 4
残り物の常識、別方向からの決定
V pair_number_search_process あるBlock 2つだけの数字が水平ま
たは垂直に並んでいるとき、同行ま
たは同列にはその数字は入らない。
中級パターン③
ローカル系
G pair_block_cell_search_process
pair_line_cell_search_process
pair_column_cell_search_process
同Block、同列、同行内で二つのセルが同じ数字の二つの候補だけを
もつとき、Block 内、同列、同行の他のセルはそれらの候補をもたない。
Q double_pair_cell_search 同Block,同行、同列で二つのセル
line_column_double_pair_cell_search が二つの数字を専有する
ときこれらのセルは他の候補を持たない。
上級パターン①
定員確定の法則
コンビネーション系
二重線の常識
T triple_block_cell_search_process
triple_column_cell_search_process
triple_line_cell_search_process
同Block,同行、同列で三つセルが三つの数字を専有するとき
これら以外のセルはその三つの数字の候補を持たない。
三国同盟
P parallel_line_number_search_process
parallel_column_number_search_process
二つの行または列に同じ数字の入るセルが二つありその列
または行が等しいとき他のセルにはその数字は入らない。
四角の対角線
マトリックス系
U triple_parallel_line_number_search_process
triple_parallel_column_number_search_process
三つの行または列にわたり二つの数字をもつ番地が交互に
配列されるとき同じ列または行の他のセルにはその数は入
りえない。
マトリックス系
R triple_pair_block_search
triple_pair_line_column_search
同じBlock,行、列の中の三つのセルに三の同じ数字を持つ
セルがあればそのセルは三つの数字で専有され他の候補
を持たない。
コンビネーション系
S cross_pair_block_search
cross_pair_line_column_search
あるBlockの二つの数字の行または列が等しく、他のBlock
の同じ数字の一つが同行または同列にあるとき残のセルが
その数字になる。
point 5
コンビネーション系
H Hamada_line_search
Hamada_column_search
同Blockの二つのセルと同行、同列にあるセルの同じ二つの
候補より巧妙にこれらの数字を特定する。
浜田ロジック
W pair_number_line_search
ある行の二つの数字の候補が、あるBlockにあるときBlock内
のセルはその数字の候補を持たない。
A output_two_candidate
new_class_search
二つに候補をもつセルの一つの数字を仮定して探索を続ける。
もし行き詰ると、もうひとつの他の数字が特定できる。
矛盾の常識
Y pair_number_column_search
ある列の二つの数字の候補が、あるBlockにあるときBlock内
のセルはその数字の候補を持たない。
X triple_number_search_process
同Block内の3つの候補が同行または同列に並ぶときその行、
列の他のセルはその候補を持たない。
中級パターン②
ローカル系
空き直線の常識
K triple_parallel_line_search
triple_parallel_column_search
二つの行(列)に候補が矩形状に配置されるとき、同じ数字
をもつ他の行(列)の数字が特定される。
四角の対角線
D rectangular_block_line_search
rectangular_block_column_search
二つの行(列)に候補が矩形状に配置されるとき、同行(列)
に同じ数字をもつBlockの数字が特定される。
公表されている解法は次の資料を参考にしました。
(1) ニコリ「数独」名品100選:ニコリ編著 (文芸春秋)
初級パターン、中級パターン、上級パターン
(2) ナンプレ超上級編11 西尾徹也 (世界文化社)
三国同盟、四角の対角線、浜田ロジック
(3) 難問ナンプレに挑戦 2 稲葉直貴 (世界文化社)
ローカル系、コンビネーション系、マトリックス系
(4) 西尾徹也のナンプレBS 100 西尾徹也 (世界文化社)
point 1~point 5、point 6(定員確定の法)
(5) ナンバープレイス解法教室 藤原
http://www.pro.or.jp/~fuji/java/puzzle/numplace/knowhow.1-1
平行線、水平線、垂直線の常識
直交平行線の常識,別方向からの決定
二重線の常識、空き直線の常識
残り物の常識、矛盾の常識
探索法はすでに述べた4つの基本サーチに加えて15個の探索法よりなっている。一つひとつの説明は省略するが、その全体の概要は次の通りである。
探索記号 マクロの名称 探索原理と公表されている解法
(文献は下記に示す)
B B_search あるBlockの中で入るセルが一つしかない数
字を探す。
初級パターン①②③④
point 1
平行線、水平線、垂直線の常識
直交平行線の常識
L L_search ある行の中で入るセルが一つしかない数字を
探す。
初級ショキュウパターン⑤
point 2
C C_search ある列の中で入るセルが一つしかない数字
を探す。
point 3
M M_search 一つしか候補をもたないセルを探す。
中級パターン④、⑤
上級パターン②
point 4
残り物の常識、別方向からの決定
V pair_number_search_process あるBlock 2つだけの数字が水平ま
たは垂直に並んでいるとき、同行ま
たは同列にはその数字は入らない。
中級パターン③
ローカル系
G pair_block_cell_search_process
pair_line_cell_search_process
pair_column_cell_search_process
同Block、同列、同行内で二つのセルが同じ数字の二つの候補だけを
もつとき、Block 内、同列、同行の他のセルはそれらの候補をもたない。
Q double_pair_cell_search 同Block,同行、同列で二つのセル
line_column_double_pair_cell_search が二つの数字を専有する
ときこれらのセルは他の候補を持たない。
上級パターン①
定員確定の法則
コンビネーション系
二重線の常識
T triple_block_cell_search_process
triple_column_cell_search_process
triple_line_cell_search_process
同Block,同行、同列で三つセルが三つの数字を専有するとき
これら以外のセルはその三つの数字の候補を持たない。
三国同盟
P parallel_line_number_search_process
parallel_column_number_search_process
二つの行または列に同じ数字の入るセルが二つありその列
または行が等しいとき他のセルにはその数字は入らない。
四角の対角線
マトリックス系
U triple_parallel_line_number_search_process
triple_parallel_column_number_search_process
三つの行または列にわたり二つの数字をもつ番地が交互に
配列されるとき同じ列または行の他のセルにはその数は入
りえない。
マトリックス系
R triple_pair_block_search
triple_pair_line_column_search
同じBlock,行、列の中の三つのセルに三の同じ数字を持つ
セルがあればそのセルは三つの数字で専有され他の候補
を持たない。
コンビネーション系
S cross_pair_block_search
cross_pair_line_column_search
あるBlockの二つの数字の行または列が等しく、他のBlock
の同じ数字の一つが同行または同列にあるとき残のセルが
その数字になる。
point 5
コンビネーション系
H Hamada_line_search
Hamada_column_search
同Blockの二つのセルと同行、同列にあるセルの同じ二つの
候補より巧妙にこれらの数字を特定する。
浜田ロジック
W pair_number_line_search
ある行の二つの数字の候補が、あるBlockにあるときBlock内
のセルはその数字の候補を持たない。
A output_two_candidate
new_class_search
二つに候補をもつセルの一つの数字を仮定して探索を続ける。
もし行き詰ると、もうひとつの他の数字が特定できる。
矛盾の常識
Y pair_number_column_search
ある列の二つの数字の候補が、あるBlockにあるときBlock内
のセルはその数字の候補を持たない。
X triple_number_search_process
同Block内の3つの候補が同行または同列に並ぶときその行、
列の他のセルはその候補を持たない。
中級パターン②
ローカル系
空き直線の常識
K triple_parallel_line_search
triple_parallel_column_search
二つの行(列)に候補が矩形状に配置されるとき、同じ数字
をもつ他の行(列)の数字が特定される。
四角の対角線
D rectangular_block_line_search
rectangular_block_column_search
二つの行(列)に候補が矩形状に配置されるとき、同行(列)
に同じ数字をもつBlockの数字が特定される。
公表されている解法は次の資料を参考にしました。
(1) ニコリ「数独」名品100選:ニコリ編著 (文芸春秋)
初級パターン、中級パターン、上級パターン
(2) ナンプレ超上級編11 西尾徹也 (世界文化社)
三国同盟、四角の対角線、浜田ロジック
(3) 難問ナンプレに挑戦 2 稲葉直貴 (世界文化社)
ローカル系、コンビネーション系、マトリックス系
(4) 西尾徹也のナンプレBS 100 西尾徹也 (世界文化社)
point 1~point 5、point 6(定員確定の法)
(5) ナンバープレイス解法教室 藤原
http://www.pro.or.jp/~fuji/java/puzzle/numplace/knowhow.1-1
平行線、水平線、垂直線の常識
直交平行線の常識,別方向からの決定
二重線の常識、空き直線の常識
残り物の常識、矛盾の常識
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年9月15日火曜日
(44) ナンバープレースのモデル化
数学的手法でもって、あるいはコンピュータを使ってある問題を解くとき、まず数式で取り扱えるように、問題の本質(特性)をかえることなく、考えやすいモデルであらわせないかどうかをかんがえる。そのように考えだされたものがモデル化ということが出来る。
ナンバープレースにおいては、空白セルの中に数字をいれる。セルはユニット( Block , Row , Column ) に属し、数字はユニットの unique digit である。したがって、セルで考えるか、数字で考えるかで、二つのモデルが存在する。正確には、それぞれ、三つのモデルを構成する。
候補の数字を要素にもつセルは candidate matrix ( candy_table ) である。candidate を一つしか持たないセルはその数字が answer となる。( M サーチ ) 本来は candy_table は三つよりなる物だが、これはこれまでの成り行きでまとめて一つとしよう。
ナンバープレースの解き方の基本は「候補の数字を一つしか持たないセル」を探すことと「数字のはいる場所が一つしかないセル」を見つけることである。この基本を一度の操作で見極められるサーチが基本サーチと呼ぶ。Block , Row , Column のそれぞれに対して、Bサーチ、Rサーチ、Cサーチが存在する。基本サーチはこの四つである。複数個の候補を持つセルから、その数字の配列特性を考慮して、如何にして候補の数を絞りこむかが探索法の鍵である。
ナンバープレースにおいては、空白セルの中に数字をいれる。セルはユニット( Block , Row , Column ) に属し、数字はユニットの unique digit である。したがって、セルで考えるか、数字で考えるかで、二つのモデルが存在する。正確には、それぞれ、三つのモデルを構成する。
候補の数字を要素にもつセルは candidate matrix ( candy_table ) である。candidate を一つしか持たないセルはその数字が answer となる。( M サーチ ) 本来は candy_table は三つよりなる物だが、これはこれまでの成り行きでまとめて一つとしよう。
ナンバープレースの解き方の基本は「候補の数字を一つしか持たないセル」を探すことと「数字のはいる場所が一つしかないセル」を見つけることである。この基本を一度の操作で見極められるサーチが基本サーチと呼ぶ。Block , Row , Column のそれぞれに対して、Bサーチ、Rサーチ、Cサーチが存在する。基本サーチはこの四つである。複数個の候補を持つセルから、その数字の配列特性を考慮して、如何にして候補の数を絞りこむかが探索法の鍵である。
2009年9月12日土曜日
(43) カラーナンプレ ( SUDOKU_Ver30 )
カラー・ナンプレ、もしくはツートン・カラー・ナンプレは、ノーマルナンプレに、さらに色づけされた 9個のセルからなる Block が追加されている。通常この Block に属するセルは縦横に連続した形状となっていて、これが二つの Block からなる場合には、ツートン・カラー・ナンプレと呼ばれる。
2006年8月9日 SUDOKU_Ver27 (幾何学ナンプレ)より発展させて、専用の SUDOKU_Ver30 を作成した。 幾何学ナンプレ用の block 分けの nx( i , j ) matrix に加えて、さらに color block ようの matrix である cx( i , j ) matrix を追加した。したがって、この方式では、ノーマルナンプレでなくても、任意の Block 割りのものにも対応することが出来る。
2006年8月9日 SUDOKU_Ver27 (幾何学ナンプレ)より発展させて、専用の SUDOKU_Ver30 を作成した。 幾何学ナンプレ用の block 分けの nx( i , j ) matrix に加えて、さらに color block ようの matrix である cx( i , j ) matrix を追加した。したがって、この方式では、ノーマルナンプレでなくても、任意の Block 割りのものにも対応することが出来る。
2009年9月11日金曜日
(42) 幾何学ナンプレ(SUDOKU_Ver27)
幾何学ナンプレは、別名ジグザグ・ナンプレとかジグソー・ナンプレとか呼ばれている。ノーマル・ナンプレは 9×9 の 81個のセルが規則正しく整列した 3×3 の9個のセルからなる9個の正方形の Block により構成される。一方、幾何学ナンプレは、不規則な9個のセルからなる 9個の Block から構成される。
2006年8月7日(月) 幾何学ナンプレに挑戦する。これは、あっけないぐらい簡単に成功した。もともと candy_table で候補の一覧を書き出し、 Block number 毎に検索するこの方式は幾何学ナンプレに向いているのではないか?SUDOKU_Ver.21 より改変して、SUDOKU_Ver.27 とした。
具体的には、group_search をやめにして、 transfer_problem で読み込んだ nx( ci, cj) matrix を checkmate の中で group 判定を行う。 group 分けのインプットは Sheet 2 に givens のインプットと並べておこなう。group のnumbering はどの順番であってもかわらない。nx matrix を使って、ノーマル・ナンプレの検証を行うことができる。
2006年8月7日(月) 幾何学ナンプレに挑戦する。これは、あっけないぐらい簡単に成功した。もともと candy_table で候補の一覧を書き出し、 Block number 毎に検索するこの方式は幾何学ナンプレに向いているのではないか?SUDOKU_Ver.21 より改変して、SUDOKU_Ver.27 とした。
具体的には、group_search をやめにして、 transfer_problem で読み込んだ nx( ci, cj) matrix を checkmate の中で group 判定を行う。 group 分けのインプットは Sheet 2 に givens のインプットと並べておこなう。group のnumbering はどの順番であってもかわらない。nx matrix を使って、ノーマル・ナンプレの検証を行うことができる。
2009年9月3日木曜日
(41) 対角線ナンプレ(SUDOKU_Ver.26)
対角線ナンプレはノーマル・ナンプレのルールに加えて、さらに二つの対角線上の 9個のセルにも 1 から 9 までの数字が一つずつ入るというルールが加わる。これに対応するマクロは check の中に数行のステートメントを追加するだけでよい。
改正マクロは次のようになる。
if iii<>jjj then goto contd
for i=1 to 9
for j=1 to 9
if i=j then
ccc=Cells( 6+i, 1+j)
if aaa=ccc then goto contaaa
end if
next j
next i
contd:
改正マクロは次のようになる。
if iii<>jjj then goto contd
for i=1 to 9
for j=1 to 9
if i=j then
ccc=Cells( 6+i, 1+j)
if aaa=ccc then goto contaaa
end if
next j
next i
contd:
if iii<>(10-jjj) then goto contd
for i=1 to 9
for j=1 to 9
if i=10-j then
ccc=Cells( 6+i, 1+j)
if aaa=ccc then goto contaaa
end if
next j
next i
contdj:
ここに、 Sheet 1 の ( 7, 2) から ( 15, 10) に A 画面があり、前半の部分が右下がりの対角線で、後半の部分が左下がりの対角線に相当する。
2009年9月2日水曜日
(40) 合体ナンプレ事始
ナンプレファンに載っている最もやさしい2葉の合体ナンプレについてやってみた。(SUDOKU_Ver25) 2葉のうち、一つのナンプレだけを取り出し、スタンダード・ナンプレとして解いてみる。方法は原始的なもので、行き詰ったところを出発点として、共通部分の空白セルの候補をもう一つのナンプレとの関連から類推して、試行錯誤で求めていくやり方である。
当時の記録から合体ナンプレの取り組みを書き記そう。
2006年7月31日 合体ナンプレの専用ソフト Ver.25 を立ち上げた。簡単に解けるものもあったが、大体はうまくいかない。一つのナンプレだけ取り出して解いてみると、10種類もの多数解が求まるものもあった。
2006年8月4日 合体ナンプレに取り組んでいるが、どうも手強い。何かうまい法則を見つけないとてに終えない。
ニコリ別冊に載っていた数独作者たちの座談会で老人たちが語っていたことを思い出した。「表出数の個数の少ないのを作っていく。20個にしたときに解き方のパターンが決まってくる」
何のことだか分からない。どのように取り組んだらいいのか。共通部分をどのように活用するのか。何かよい方法はないだろうか。どうもわからないことばかりである。
2006年8月6日 合体ナンプレの道が少しばかり開けた。数独の世界にこんな法則があったのかという思いがした。馬鹿だなあ。ちゃんとした候補があるのに。
これ以後合体ナンプレへの取り組みを中断する。スタンダード・ナンプレの解法に画期的なVBAの解法を発見したからである。それと、和歌山ソフコンの申し込みが迫ってきているからである。
その後、合体ナンプレの取り組みは2007年11月まで続き、60種類の合体ナンプレ(最高59連ナンプレ)が自動的に解けるソフトを開発した。これも、長い長い苦労話があり、項を改めて書くことにしよう。
当時の記録から合体ナンプレの取り組みを書き記そう。
2006年7月31日 合体ナンプレの専用ソフト Ver.25 を立ち上げた。簡単に解けるものもあったが、大体はうまくいかない。一つのナンプレだけ取り出して解いてみると、10種類もの多数解が求まるものもあった。
2006年8月4日 合体ナンプレに取り組んでいるが、どうも手強い。何かうまい法則を見つけないとてに終えない。
ニコリ別冊に載っていた数独作者たちの座談会で老人たちが語っていたことを思い出した。「表出数の個数の少ないのを作っていく。20個にしたときに解き方のパターンが決まってくる」
何のことだか分からない。どのように取り組んだらいいのか。共通部分をどのように活用するのか。何かよい方法はないだろうか。どうもわからないことばかりである。
2006年8月6日 合体ナンプレの道が少しばかり開けた。数独の世界にこんな法則があったのかという思いがした。馬鹿だなあ。ちゃんとした候補があるのに。
これ以後合体ナンプレへの取り組みを中断する。スタンダード・ナンプレの解法に画期的なVBAの解法を発見したからである。それと、和歌山ソフコンの申し込みが迫ってきているからである。
その後、合体ナンプレの取り組みは2007年11月まで続き、60種類の合体ナンプレ(最高59連ナンプレ)が自動的に解けるソフトを開発した。これも、長い長い苦労話があり、項を改めて書くことにしよう。
登録:
投稿 (Atom)