基本的なナンプレの解法を説明する前に、具体的なナンプレを例にとり、構造解析に必要なDiagram を示しておこう。
例題として、「ニコリ名品100選」の1番を取り上げよう。
Fig. 5 Row Column Diagram
まず最初に、Fig.5 の空白セル( Empty Cell ) のそれぞれに入る候補の数字を小文字で挿入すれば、Fig. 6 で表される。
Fig. 6 Number Candidate Diagram
この候補の一覧表を Candy Table と呼ぶこととする。
2012年2月21日火曜日
2012年2月19日日曜日
ナンプレの構造
ナンプレ( number place )は、構造的には、数字と場所を探すパズルである。数字は1から9までの9種類、場所は、9個の block、row、column のセルにそれぞれ 9ヶ所ある。
この4つの number、block、row、column を2次元座標で表現する。( row , column ) 座標で表したDiagram ( Fig.1 ) が、通常のナンプレ本に表れる Diagram(盤面)である。
場所を示す番地を、block , row , column 毎に、Fig. 1 の 1 から 9 までの数字に対応して表す。番地であることがわかるように、数字の代りに、a b c d e f g h i を使うことにする。
例えば、 ( 2 , 3 ) に対応する場所は、block-number 座標では、B1-f となる。同様に、 row-number 座標では、R2-c 、number-column 座標では、 C3-b である。
上の Diagrum をそれぞれの座標をもつ Diagram に変換すると次のようになる。
この4つの number、block、row、column を2次元座標で表現する。( row , column ) 座標で表したDiagram ( Fig.1 ) が、通常のナンプレ本に表れる Diagram(盤面)である。
Fig. 1 Number place diagram
場所を示す番地を、block , row , column 毎に、Fig. 1 の 1 から 9 までの数字に対応して表す。番地であることがわかるように、数字の代りに、a b c d e f g h i を使うことにする。
例えば、 ( 2 , 3 ) に対応する場所は、block-number 座標では、B1-f となる。同様に、 row-number 座標では、R2-c 、number-column 座標では、 C3-b である。
上の Diagrum をそれぞれの座標をもつ Diagram に変換すると次のようになる。
Fig. 2 Block-Number Diagram
Fig. 3 Row-Number Diagram
Fig. 4 Number-Column Diagram
最初は慣れていないので、わかりづらいが、やがてナンプレ解法の構造が容易に理解できるようになるだろう。
2011年11月14日月曜日
Search macro
Search macro は、次の 3種類に大分類される。
(1) Basic search
Single candidate を探し、セルの値を決定するマクロで 4種類からなる。
① B_search Single candidate in Block
② R_search Single candidate in Row
③ C_search Single candidate in Column
④ M_search Single cell in any digit
(2) Deform search
Candidate を logical な方法で、消去する。よく eliminate が使われるが、ここでは doformを使う。
中分類で、23種類の deform macro が登録されている。
V、W, Q, G, P, Φ、Δ、 K, S、 Ξ、 H、Ω、Y, Π、Γ、Λ
L, T, U、N, J, O, F, I, J, A
小分類では、さらに 3個の deform macro に分かれる。
例えば、 V_deform は、Vb_deform、 Vr_deform, Vc_deform よりなる。
(3) Combine macro
複数の deform macro の組み合わせた deform macroで 小文字で表す。
”v”、”q”、によって、複数の変形と複数の探索を行う。
”q”の時には、"vq"、"wq" の変形をおこなう。
探索の方法(search_macro)の紹介は「ナンプレの構造」を使って次回以降説明します。
(1) Basic search
Single candidate を探し、セルの値を決定するマクロで 4種類からなる。
① B_search Single candidate in Block
② R_search Single candidate in Row
③ C_search Single candidate in Column
④ M_search Single cell in any digit
(2) Deform search
Candidate を logical な方法で、消去する。よく eliminate が使われるが、ここでは doformを使う。
中分類で、23種類の deform macro が登録されている。
V、W, Q, G, P, Φ、Δ、 K, S、 Ξ、 H、Ω、Y, Π、Γ、Λ
L, T, U、N, J, O, F, I, J, A
小分類では、さらに 3個の deform macro に分かれる。
例えば、 V_deform は、Vb_deform、 Vr_deform, Vc_deform よりなる。
(3) Combine macro
複数の deform macro の組み合わせた deform macroで 小文字で表す。
”v”、”q”、によって、複数の変形と複数の探索を行う。
”q”の時には、"vq"、"wq" の変形をおこなう。
探索の方法(search_macro)の紹介は「ナンプレの構造」を使って次回以降説明します。
2011年10月23日日曜日
Ranking List
現在使っている数独のレベル表示
26 Stratage Levels presented by Ryuzen ; Numberplace Ranking Program
① Beginner B(1)
② Very Easy +R(2)、C(3)
③ Easy + M(4)
④ Cute +V(5)
⑤ Sweet +W(6)
⑥ Lovely +Q(7)
⑦ Smart +G(8)
⑧ Ladybird +v(31),w(32)
⑨ Pleasant +q(33)
⑩ Comfort +g(34)
⑪ Honeybee +P(9), +Φ(10) +Ξ(13)
⑫ Healthy +p(35) +φ(36) +ξ(39)
⑬ Joyful +S(12) +K(11) +s(38) +k(37)
⑭ Satisfy +Y(17) +y(42)
⑮ Dream +H(14) +Ω(15) +h(40) +ω(41)
(16) Dragonfly +L(18) +T(19)
(17) Beetle +U(20) +u(45)
(18) Thunder +l(43) +t(44)
(19) Nightmare +N(21) +O(22) +J(23)
(20) Pain +n(46) +o(47) +j(48)
(21) Fear +F(49) +Z(25) +I(26)
(22) Death +f(49) +z(50) +i(51)
(23) UFS +Γ
(24) Birdy A
(25) Eargle
(26) Albatoross
2011年10月21日金曜日
A search memorandum (3)
numk=1 の a0 の試行が終了すると、次の段階へと移る。
numk=2 になったとき、klevel=1 であれば、 a0 で破綻、逆に b0 は決まり。
klevel=2 であれば、 a0 b0 ともに健全、 b0 で試行。
a0 で破綻の場合、klevel=1 であるので、まだ新しい候補 a1、 b1 は読み込まれていないので、当然 a1="" である。
この時、 b0 は決まりであるので、 Sheet 1 のDIAGRAM に b0 を代入、これを元の問題とするために、次の 4つのことをする。
① b0 の入った問題を新しい出発点とするため、 transfer_A_to_C で C に移す。
② numk=1 に戻す。
③ Sheet 9 の D25:K25 の候補の数字を Erase する。
④ これまで、求まった解の数 numa をつなげる。ippatsu の contrepeat に返る。変わっていないのは、 klevel だけであり、今後の仮定回数にプラスされる。
klevel=2 になっている場合、 a0 がまだ生きている。したがって b0 の試行を行う。
klevel=2、 numk=2 の場合、a0 b0が残っており、次のステップ numk=3 に進む。
numk=2 になったとき、klevel=1 であれば、 a0 で破綻、逆に b0 は決まり。
klevel=2 であれば、 a0 b0 ともに健全、 b0 で試行。
a0 で破綻の場合、klevel=1 であるので、まだ新しい候補 a1、 b1 は読み込まれていないので、当然 a1="" である。
この時、 b0 は決まりであるので、 Sheet 1 のDIAGRAM に b0 を代入、これを元の問題とするために、次の 4つのことをする。
① b0 の入った問題を新しい出発点とするため、 transfer_A_to_C で C に移す。
② numk=1 に戻す。
③ Sheet 9 の D25:K25 の候補の数字を Erase する。
④ これまで、求まった解の数 numa をつなげる。ippatsu の contrepeat に返る。変わっていないのは、 klevel だけであり、今後の仮定回数にプラスされる。
klevel=2 になっている場合、 a0 がまだ生きている。したがって b0 の試行を行う。
klevel=2、 numk=2 の場合、a0 b0が残っており、次のステップ numk=3 に進む。
2011年10月20日木曜日
A search memorandum (2)
new_class_search に klevel=1, numk=1 で入った時、まづ a0 を用いて計算を開始する。numk=numk+1 で numk=2 にして、 ippatsu にもどり、探索計算を行う。
その結果は次の 3ケースに分かれる。
① a0 の仮定だけで、msd を実施、final_answer_check において、 msg="Conouer " となった場合。唯一解の場合には、exit sub とする。
② a0 の仮定で破綻した場合。can ( i, 5)=0 となる場合で、stopflag="stop" にする。この後、新しい候補を求めないで、 klevel=1 のまま new_class_search に戻る。マクロの中での判定は、stopflag でもよいが、次の候補は読み込まれていない。つまり a1="" であることがわかる。
③ a0 の仮定ではまだ、決着がつかない場合。もう一度の break though をはかる。 klevel=2 にして、次の候補、 a1, b1 を Sheet 9 に書き込む。(この段階で、まだ b0 の試行を行っていないことに注目。)
その結果は次の 3ケースに分かれる。
① a0 の仮定だけで、msd を実施、final_answer_check において、 msg="Conouer " となった場合。唯一解の場合には、exit sub とする。
② a0 の仮定で破綻した場合。can ( i, 5)=0 となる場合で、stopflag="stop" にする。この後、新しい候補を求めないで、 klevel=1 のまま new_class_search に戻る。マクロの中での判定は、stopflag でもよいが、次の候補は読み込まれていない。つまり a1="" であることがわかる。
③ a0 の仮定ではまだ、決着がつかない場合。もう一度の break though をはかる。 klevel=2 にして、次の候補、 a1, b1 を Sheet 9 に書き込む。(この段階で、まだ b0 の試行を行っていないことに注目。)
2011年10月19日水曜日
A search memorandum (1)
A search について、メモしよう。
最初に使用する用語の説明
① 打開 break through /// klevel
候補の呼び出し回数を表す指数
② 破綻 failure /// stopflag
間違った候補の数字を仮定すると破綻をきたす。このチェックは count_kosuu で行う。セルのもつ候補がない時、明らかに破綻である。 stopflag="stop" とする。
③ 征服 conquer /// msg="Conquer"
final_answer_check において、すべての条件を満足すると、 msg="Conquer" となる。唯一解の場合には、ここでとどめてもよい。複数解の場合には続ける。
④ 試行 trial /// numk
仮定した数字を用いて解析を進める。numk=2^6=64 で次の階層に入る。ただし、破綻をきたした段階で、numk を元の階層に戻す。
さて、klevel=0, numk=1 で始まる探索の旅であるが、 fmid と msd で取りつくしても、conquer に至らぬとき、万策尽きて A search に突入する。
まず output_two_candidate により、二択の候補を Sheet 9 の D25:K25 に書き込む。
簡単のため、 a0 , b0 でもって説明する。
最初に使用する用語の説明
① 打開 break through /// klevel
候補の呼び出し回数を表す指数
② 破綻 failure /// stopflag
間違った候補の数字を仮定すると破綻をきたす。このチェックは count_kosuu で行う。セルのもつ候補がない時、明らかに破綻である。 stopflag="stop" とする。
③ 征服 conquer /// msg="Conquer"
final_answer_check において、すべての条件を満足すると、 msg="Conquer" となる。唯一解の場合には、ここでとどめてもよい。複数解の場合には続ける。
④ 試行 trial /// numk
仮定した数字を用いて解析を進める。numk=2^6=64 で次の階層に入る。ただし、破綻をきたした段階で、numk を元の階層に戻す。
さて、klevel=0, numk=1 で始まる探索の旅であるが、 fmid と msd で取りつくしても、conquer に至らぬとき、万策尽きて A search に突入する。
まず output_two_candidate により、二択の候補を Sheet 9 の D25:K25 に書き込む。
簡単のため、 a0 , b0 でもって説明する。
登録:
投稿 (Atom)





