2013年7月23日火曜日

L-search memorandam (9) Example of Lc-search(2)

room=3 (三国同盟のように、3つのセルと3つの数字が関係する技)の場合、マクロを共有します。

            Strategy                Notation       Used  matrix & Coordinate          Used matrix

 Implicit Triple ( Block )  Lb         Place (Block , Number )             gg_matrix ( gb-matrix)
 Implicit Triple ( Row   )  Lr         Place  (Row   , Number )             gr_matrix (gl-matrix )
 Implicit Triple ( Column ) Lc         Place  (Number , Column )           gc_matrix

  Explicit Triple  ( Block )      Tb        Place  ( Number , Block )           Transposed matrix of gg_matrix
  Explicit Triple  ( Row  )       Tr        Place  ( Number , Row )             Transposed matrix of gr_matrix
  Explicit Triple   ( Column )   Tc       Place  ( Column , Number )         Transposed matrix of gc_matrix

  Swordfish   ( Row )              Ur      Number ( Row , Column )            Candy_matrix
  Swordfish  ( Column )           Uc      Number ( Column, Row )           Transposed_matrix of candy_matrix

 where,  Implicit means term of  "Hidden" and Explicit means that of "Naked" respectively.

今回の実例の場合、Lc(Implicit Triple of Column )で初めて当てはまるケースが見つかります。探索には、gc-matrix を使います。

先に示した candy matrix より、gc-matrix を作成します。

                                          Fig 1   gc-matrix converted from candy matrix

黄色のセルは、3国同盟を形成する第7列目にある3つに部屋 cdh でそこに 379 の数字の候補が入ります。candy matrix では、他の候補とまぎれた”hidden”の状態ですが、この gc-matrix では、”naked” の状態になります。

ここに、念のため記しておきますが、部屋の呼び名は、それぞれの列で、上から順にa,b,c,・・となります。


Fig. 2   Notation of each place at column 7

Lc_search に入ると、一列目(icol=1)から順に三国同盟が成立するかを調べていきます。

第7列になったときのgc-matrix より作成した chainr-matrix は次のようになっています。


Fig.3 Candidates of place for each number

第7列目で、候補の数字を持つ場所(Place)がmatrixの値となります。

Step 1 の candy matrix で、上の表の意味を確認下さい。

右端および下端の数は、placeおよびnumber の候補の数です。chainr-matrix (Fig.3)からColumn 7ですでに決まった数字を持つ3つの場所を除き、候補の数が少ない順に列および行を並べ変えます。


           Fig.4  Aranged chainr-matrix
さらに、三国同盟(room=3)を形成するのは、knum<=room つまり候補の数が3以下の場合なのでそれ以上の候補を持つ行、列を除きます。


Fig. 5 Condensed chainr-matrix called as jun-matrix
 さらに、該当する行と列だけに絞り込みます。

Fig.5  Rearanged jnn-matrix

最終的に三国同盟を形成する3つの数字が入る3つのセルがもとまりました。

Fig.6 Implicit Triple derived  from gc-matrix of column 7

Lc-search では、C7-c, -d, -h の3つのセルは、379で占有されるので、それ以外の候補の数字があれば、これらのセルから消去されます。

その結果として、これらのセル以外の場所で、これらの数字以外候補が基本技で決まる(場合がある)ことになります。

何と言っても、このアルゴリズムの凄いところは、三国同盟を形成する候補の組み合わせを全て一つのマクロでカバーしていることです。

2013年7月22日月曜日

L search memorandam (8) Example of Lc-search

Lc-search ( Implicit Triple of Column,  三国同盟)のわかりやすい例として、「ナンプレ超上級編30」の31番の問題を取り上げます。

           「ナンプレ超上級編30」031番 ☆☆☆☆☆☆ 作・西山ゆかり

この問題は、第一手目がいきなり、Lc (Implicit Triple of Column )の技を使います。それ以降はすべて基本技で取れるという L-search の練習のような 問題です。



 ここでは、”Ryuzen” ソフトが如何にして、第一手 (8,4)=6 LcR を見つけだすかを説明します。

最初に第1手の Candy matrix を示しておきます。

         
Pencil Player の場合には、熟練の勘で、これらの候補の中から 第7列(C7)において 379が3つのセルを独占する(三国同盟)のを見つけます。

379 の候補だけのCandy matrix は次のようになっています。ここで、379の数字が3つのセルだけにしか表れないというのがポイントです。第1行や第4行でも379で占める3つのセルが存在しますが、他のセルにも3や7や9が存在するので三国同盟にはなり得ません。



これさえ見つければ、あとは簡単で、第一手は次のようになります。



ピンクのセルの三国同盟で、 (8,7) のセルには、39 しか入らないので、8行目において、6が入るのは、白いセルの(8,4)=6 となります。

最終結果と決まる順番です。

                 Final Answer



                                       Order and used strategy


それでは、”Ryuzen” ソフトでは、如何にしてこの379の三国同盟を見つけ出すのでしょうか?

                                          To be continue

2013年6月27日木曜日

L search memorandam (7) Example of Lb-search

L-search の例として、「超難問ナンプレAAA4」に掲載の次の問題を取り上げます。


                                              Original Puzzle :  AAA4-No.63 by Trickmachin


最終結果および決定順序と使用する技はつぎのようなものです。


                                        Final Answer : Blue cells mean determined value be Hidden Triple


                                           Small font blue number shows determined order
                                           and color of cells indicate used strategy such as
                                                White cell  :  Hidden Single of Block
               

さまざまな技が出てきますが、L-search が関係するのは、赤色のセルの値です。

解は次のような順に決まっていきます。



第6手目で、初めて Lb ( Implicit Triple of Block )の技を使います。

第5手目までの盤面です。


この段階で、第6手目が ( 2, 3) = 8 であると言われても、どうして (1,2) に 8 が入り得ないのか皆目見当もつきません。

とりあえず Candy matrix を示すと次の図になります。




 Block 1 に注目して下さい。 gg-matrix を示すと次のようになります。


Block 1 は一行目に相当します。Block 1 の 9 つの部屋( abcdefjhi )の内、abd の3つの部屋は、数字 123で独占されることが分かります。

Candy matrix で 123 だけの候補を示せばもっとよくわかります。



Block 1 において、3つのセル( 1, 1) ( 1, 2) ( 2, 1) が  1, 2, 3 で占有されます。前に示した
Candy matrix では、他の候補とまぎれて(隠れて、hidden)見つけにくかった候補の123もくっきりと浮かび上がります。

Implicit Triple の技は、この3つのセルから、123以外の候補を追い出す(消去する)ことです。
その結果、(1,2)のセルから 458 が消去され、Block 1において、(3,2)=8 が Single candidate (ブロッケン)となります。

Implicit Triple of Block  ( Lb ) で見つけ、Implicit Sigle (B) で決めるので、 LbB と書き表します。  

2013年6月26日水曜日

L search memorandam (6) column_block_room_division





Sub column_block_room_division()

Select Case kind1
Case "B"
Sheets("Sheet8").Cells(cnum, 54) = "B" & igrp & " ( " & room & ")"
Case "R"
Sheets("Sheet8").Cells(cnum, 54) = "R" & ilin & " ( " & room & ")"
Case "C"
Sheets("Sheet8").Cells(cnum, 54) = "C" & icol & " ( " & room & ")"
End Select
 aa = ""
For i7 = 1 To room
 d(i7) = jnn(0, i7)
 aa = aa & jnn(0, i7)
Next i7

If kind = "hidden" Then
  For i5 = 1 To room
   fd(0, i5) = Int(Right(d(i5), 1))
  Next i5
 
ElseIf kind = "naked" Then
  For i5 = 1 To room
   fd(0, i5) = d(i5)
  Next i5
End If

 knum = 0
 For i8 = 1 To z
  If jnn(i8, room + 1) <> 0 Then
  knum = knum + 1
  f(knum) = jnn(i8, 0)
 
   For i9 = 0 To room
   fd(knum, i9) = jnn(i8, i9)
   Next i9
  End If
Next i8


If kind = "hidden" Then
num = 0      'exchange column
For kazu = 1 To z
  For j1 = 1 To room
   If Int(Right(d(j1), 1)) = kazu Then
   num = num + 1
       For i1 = 0 To knum
       df(i1, num) = fd(i1, j1)
       Next i1
   End If
  Next j1
Next kazu

For i1 = 0 To knum
 For j1 = 1 To room
 fd(i1, j1) = df(i1, j1)
 Next j1
Next i1
End If








Lsearch(hidden) と Tsearch(naked)に分けて、fd-matrix(condenced allay matrix)またはdf matrix を作成する。(上の例は、hidden)
If kind = "hidden" Then
 
 For i7 = 1 To empty_cell
  For i6 = 1 To room
    If can(i7, 1) = f(i6) Then
          ikumi = can(i7, 5)
     For i8 = 1 To ikumi
      can(i7, 5 + i8) = ""
     Next i8
         num = 0
        For k1 = 1 To room
         If fd(i6, k1) <> "" Then
         num = num + 1
          can(i7, 5 + num) = fd(0, k1)
          can(i7, 5) = num
         End If
        Next k1
      End If
  Next i6
 Next i7

ElseIf kind = "naked" Then
   For i6 = 1 To room
    x1 = Int(Right(fd(i6, 0), 1))
  
   For i7 = 1 To empty_cell
      For i4 = 1 To room
      If can(i7, 1) = d(i4) Then GoTo conti7
      Next i4
 
      For j8 = 1 To knum
        iii = Int(Mid(d(j8), 2, 1))
        jjj = Int(Mid(d(j8), 4, 1))
       Select Case kind1
      Case "B"
        group_search
    If can(i7, 4) = grp Then GoTo conttrue
      Case "R"
    If can(i7, 2) = iii Then GoTo conttrue
      Case "C"
    If can(i7, 3) = jjj Then GoTo conttrue
      Case Else
       MsgBox ("no unit !"):    Exit Sub
      End Select
      Next j8
GoTo conti7
conttrue:

candy-matrix よりありえない候補を消去する。

         ikumi = can(i7, 5)
            For j3 = 1 To ikumi
              If can(i7, 5 + j3) = x1 Then
                 For k1 = j3 To ikumi
                 can(i7, 5 + k1) = can(i7, 6 + k1)
                Next k1
               End If
            Next j3
conti7:
   Next i7
   Next i6
End If

2013年6月24日月曜日

L search memorandam (5) column_triple_ally

jnn(z+1,room+1) matrix より、jun(room+1,room+1) に縮小する。




'
Sub column_triple_ally()
 flagL = ""
 ksum = jun(z + 1, 0)
For i9 = 1 To ksum
 For j9 = i9 + 1 To ksum
  For k9 = j9 + 1 To ksum
    For m = 0 To z + 1
    jnn(m, 0) = jun(m, 0)
    jnn(m, 1) = jun(m, i9)
    jnn(m, 2) = jun(m, j9)
    jnn(m, 3) = jun(m, k9)
    Next m

   ally_room_selection

  If flagL <> "" Then Exit Sub
    Next k9
  Next j9
Next i9
End Sub


'
 Sub ally_room_selection()
      For i5 = 0 To z + 1
      For j5 = 0 To z + 1
'     Sheets("Sheet8").Cells(6 + i5, 52 + j5) = jun(i5, j5)
     Sheets("Sheet8").Cells(6 + i5, 52 + j5) = jnn(i5, j5)
      Next j5
      Next i5
 
       For i3 = 1 To z
          inum = 0
        For j3 = 1 To room
          If jnn(i3, j3) <> "" Then
           inum = inum + 1
          End If
        Next j3
           jnn(i3, room + 1) = inum
        Next i3
         knum = 0
        For i4 = 1 To z
         If jnn(i4, room + 1) <> 0 Then
           knum = knum + 1
         End If
        Next i4
         jnn(z + 1, room + 1) = knum
     If knum > room Then
      Exit Sub
     ElseIf knum = room Then
       For i5 = 0 To z + 1
        For j5 = 0 To room + 1
          Sheets("Sheet8").Cells(6 + i5, 63 + room + j5) = jnn(i5, j5)
       Next j5
        Next i5
       
       column_block_room_division
     Else
'      MsgBox ("Qurious Case to be noticed !")
      Exit Sub
     End If
   End Sub

2013年6月22日土曜日

L search memorandam (4) column_block_judge


chainr matrix の各列の候補の数によって該当する行列に縮小する。
chainc は work area である。

Sub column_block_judge()
 Erase chainc
 ReDim chainc(z + 1, z + 1)
 num = 0
 For j = 1 To z
     aa = chainr(z + 1, j)
  If aa = "" Or aa = 1 Then GoTo contj
  If aa <= room Then
   num = num + 1
   For k = 0 To z + 1
   chainc(k, num) = chainr(k, num)
   Next k
  End If
contj:
 Next j

 For i = 0 To z + 1
   chainc(i, 0) = chainr(i, 0)
 Next i

Erase jun, jnn
 ReDim jun(z + 1, z + 1), jnn(z + 1, z + 1)
For i = 0 To z + 1
 For j = 0 To z + 1
 jun(i, j) = chainc(i, j)
  Sheets("Sheet8").Cells(6 + i, 40 + j) = jun(i, j)
 Next j
Next i
 num = 0
For j = 1 To z
If jun(z + 1, j) <> "" Then
 num = num + 1
End If
Next j
 chainc(z + 1, 0) = num
 jun(z + 1, 0) = num
If jun(z + 1, 0) < room Then
Exit Sub
End If
For i = 1 To z
 inum = 0
 For j = 1 To z
 If jun(i, j) <> "" Then
   inum = inum + 1
 End If
 Next j
 jun(i, z + 1) = inum
 chainc(i, z + 1) = inum
Next i
 For i = 0 To z + 1
  For j = 0 To z + 1
  Sheets("Sheet8").Cells(6 + i, 40 + j) = jun(i, j)
  Next j
 Next i

flagM = kind & kind1 & room
flagL = ""

room に応じて振り分ける。

Select Case room
Case 2
 column_double_ally
Case 3
 column_triple_ally
Case 4
 column_fourth_ally
Case 5
 column_fifth_ally
Case Else
 MsgBox ("This case available ! ")
End Select
End Sub

L search memorandam (3) Two_hidden_number_in_block


Lb_search の chainr matrix を整える。
chainr matrix の 行は Block番号(左上から右下まで B1からB9) 列は Digit( 1から9)である。Matrixの値は、候補の存在するセルの場所である。

chainr を作成するとともに、Sheet8 にoutput する。

   Sheets("Sheet8").Cells(6, 28) = "Place"

 For j = 1 To z
   Sheets("Sheet8").Cells(5, 30) = "Chainr Matrix"
   zzz = j
 place_from_number
  
 For iii = 1 To z
  For jjj = 1 To z
        group_search
        banti = 3 * (iii - igs) + (jjj - jgs) + 1
  If banti = zzz And igrp = grp Then
     cc = "(" & iii & "," & jjj & ")"
   Sheets("Sheet8").Cells(6 + j, 28) = cc
    chainr(j, 0) = cc
    GoTo contj:
  End If
  Next jjj
 Next iii
contj:
   chainr(0, j) = "n" & j
'   chainr(j, 0) = "B" & igrp & "-" & cc
 Next j

候補の場所の数を数えて、chainr の最下行(z+1)に記入する。 

For numb = 1 To z
    num = 0
    ikumi = gg(igrp, numb, 2)
    num = num + 1
    For k = 1 To ikumi
     cc = gg(igrp, numb, 2 + k)
     row_column_number
     iii = aa: jjj = bb
     group_search
     banti = 3 * (iii - igs) + (jjj - jgs) + 1
     Sheets("Sheet8").Cells(6 + banti, 28 + numb) = cc
     chainr(banti, numb) = cc
    Next k
    Sheets("Sheet8").Cells(6 + 10, 28 + numb) = ikumi
     chainr(z + 1, numb) = ikumi
  Next numb
 
  num_within_row




2013年6月17日月曜日

L search memorandam (2) Block select number


U search では、candy matrix ( Row vs Column ) から Swordfish に該当する 3 Pattern を見つけ出した。
L search や T search はこれに相当する matrix は、g_matrix になる。
 すなわち、 Lb search は gb_matrix (Block vs Number )
                       Lr search    は gl_matrix   ( Row vs Number )
                       Lc search   は gc_matrix    ( Column vs Number )
である。

L search の3種類の chainr matrix を作成する。

 Select Case kind1
 Case "B"
 two_hidden_number_in_block
 Case "R"
 two_hidden_number_in_row
 Case "C"
 two_hidden_number_in_column
 Case Else
  MsgBox ("No place in hidden digit!")
 End Select

各Block の候補の入っているセルの数を数えて chainc の右端 (z+1)列 に書き込む。
chainc は work area である。

   num = 0
 For kosu = 1 To z
  For i = 1 To z
 If chainr(i, z + 1) = kosu Then
   num = num + 1
   For j = 0 To z + 1
   chainc(num, j) = chainr(i, j)
   Next j
 End If
  Next i
 Next kosu

ひとまず、 chainr に移す。

 For i = 1 To z
  For j = 0 To z + 1
     chainr(i, j) = chainc(i, j)
  Next j
 Next i

同様のことを 列( Digit ) についても行う。

    num = 0
 For kosu = 1 To z
  For j = 1 To z
 If chainr(z + 1, j) = kosu Then
   num = num + 1
   For i = 0 To z + 1
      chainc(i, num) = chainr(i, j)
   Next i
 End If
  Next j
 Next kosu
 For i = 0 To z + 1
  For j = 1 To z
       chainr(i, j) = chainc(i, j)
  Next j
 Next i



Block 1(左上のブロック)の gb-matrix より chairr matrixを作る。


以上は L search ( Hidden ) の場合であるが、T search の場合には、その転置行列を作成してそれを使う。

つまり、Hidden の場合には、3つの部屋を占める3人を求めるのだが、Naked の場合には、3人が占める可能性がある3つの部屋を探すのである。

    Lsearch  Hidden  ( Block, Number )
    Tsearch  Naked  ( Number, Block )
   
 If kind = "naked" Then
 For i = 0 To z + 1
  For j = 0 To z + 1
       chainc(j, i) = chainr(i, j)
  Next j
 Next i
 For i = 0 To z + 1
  For j = 0 To z + 1
       chainr(i, j) = chainc(i, j)
  Next j
 Next i
 End If
 

2013年6月16日日曜日

L search memorandam (1)

Lsearch は、「三国同盟」または「陰の三国同盟」と呼ばれる。または「定員確保」や「予約」などと呼ばれることがある。

L search は先に示した U search と同じアルゴリズムを使って首尾よく求めることができる。U search は Candy matrix を使って、Ur(行) と Uc(列) の2種類があったが、L search はLb(ブロック), Lr(行)、 Lc(列)の3種類がある。そして、gb-、gr- gc- の3種類の g_matrix をcandy matrixのかわりに使う。 T search も同じマクロを使い、殆んど同じアルゴリズムで求められる。

さらに、U search でみたように、room=2,3,4,5 は同じマクロで求められる。このあたりの関係や記号の扱いは、

http://kmatsu4.blogspot.jp/2012/11/u-search-memorandam-1.html

を参照されたい。

特に、Pencil Work の経験から開発された「定員確保」と「陰の定員確保」の技の名称は、PCを使った Candidate Table (Candy matrix)から来る ” Hidden ” と ”Naked ”のNaming と逆の印象を与え、理解しにくい面があるので、注意を要します。

大雑把な説明をすると、3部屋に特定の3人しか入れないのに、それ以外の予約客が紛れ込んでいて(特定客が隠れた状態になっている)その部屋から追い出す(消去する)のが、Hidden Triple という技で、単に「三国同盟」とか「定員確定」とか呼ばれています。
 また、3部屋宛に特定の三人で予約が決まっていて、ハッキリと裸の状態にあるのに、他の部屋にも、Double Booking されているので、その予約を取り消す(消去する)というのが、Naked Triple という技です。

”Ryuzen”ソフトでは、数学用語により、 Explicit =  Naked ,    Implicit = Hidden を使っています。

 L ( Implicit Triples ) を例にとり、search flow を説明しよう。 

① L_search ( M45, 5 )
              > Lb_search    ( M45, 8)
              > Lr_search    ( M45, 9)
              > Lc_search    ( M45, 10)

② Lb_search >  hot_candy
                           Vb_Vr_Vc
                           Qb_Qr\Qc
                           Gb_Gr_Gc
                           deform_Lb     ( M46,10)  
                           scf
                           Bcf

③ deform_Lb
                      room=3
                      hidden_block_basic_deform  

④ hidden_block_basic_deform  ( M46,  4)
                      basic_setting
                kind = "hidden"
              kind1 = "B"
              flagM = kind & kind1 & room
        For igrp=1 to z
                     empty_cell_in_block  (M46, 1)
                     block_select_menber  ( M46, 11)
                      column_block_judge ( M46,111 )
        Next igrp

⑤ deform_Lr
                      room=3
                      hidden_row_basic_deform  

⑥ hidden_row_basic_deform  
      basic_setting
     kind = "row"
     kind1 = "R"
     flagM = kind & kind1 & room

    For ilin = 1 To z
     row_select_number
     column_row_judge
    Next illin

⑦ deform_Lc
                       room=3
                      hidden_column_basic_deform 

⑧  hidden_column_basic_deform  
      basic_setting
     kind = "collumn"
     kind1 = "C"
     flagM = kind & kind1 & room

    For ilin = 1 To z
     row_select_number
     column_row_judge
    Next illin

 To be continue :
        

2013年6月10日月曜日

U search memoramdum (9) Example of Swordfish

Swordfish の実例として、「世界で一番美しくて難しいナンプレ 4」より 78番の問題を取り上げます。

    
             Rank  AA-  Level 17  Beetle  Published Level  Devillish
             
             Total point 150 、 Technical 82、 Visual  68

Final answer

Order and Strategy

 
この問題では、基本技の他に使う上級技は、15手目に表れる Swordfish が一回だけです。

14手目が終わった段階で、盤面はこのようになっています。


この次の一手が問題です。一応、Candy matrix を示しておきますが、これでもどこがどうなっているのかが見当もつきません。


7の候補に注目します。
Sword fish(R) は、2行目、4行目、9行目にある白いセルのPair が構成します。結果として、2列目、5列目、9列目では白いセル以外では7の候補はもちません。

同様に9の数字に注目します。

これも、7の場合と同様に、 (2,2,2) 型の Swordfish(R) が成立しています。

これらを考慮して、7と9の候補の消去をします。下の赤いセルのようになり、(5,2)=2 のsingle candidate があぶり出されます。


  
 

2013年6月5日水曜日

U search memoramdum (8) column_fish_room_division

jnn matrix のすべての組み合わせに対して、room_selection マクロにてswordfish として成立する組み合わせを選別して次のマクロに入る。
選別されたmatrixの形は、 ( f(i), d(j) ) で表される。

 column_fish_room_divisionマクロ

該当するswordfish の組み合わせをOUTPUTする。



  cnum = 19 + i6

Sheets("Sheet8").Cells(19, 54) = "number/room"
'
Sheets("Sheet8").Cells(cnum, 51) = Sheets("Sheet1").Range("D2")
Sheets("Sheet8").Cells(cnum, 52) = flagM
Sheets("Sheet8").Cells(cnum, 54) = nb & " ( " & room & ")"
 aa = ""
For i7 = 1 To room
 d(i7) = jnn(0, i7)
 aa = aa & jnn(0, i7)
Next i7
Sheets("Sheet8").Cells(cnum, 53) = aa

 knum = 0
 For i8 = 1 To z
  If jnn(i8, room + 1) <> 0 Then
  knum = knum + 1
  f(knum) = jnn(i8, 0)
Sheets("Sheet8").Cells(cnum, 54 + knum) = jnn(i8, 0)
  End If
Next i8
'
candy matrix より、swordfish を構成する候補数字を消去する。

empty_cell = Sheets("Sheet1").Range("K2")
For i6 = 1 To knum
If Left(f(i6), 1) = "C" Then
    x2 = Int(Right(f(i6), 1))
   For i7 = 1 To empty_cell
  
      For j8 = 1 To knum
       x1 = Int(Right(d(j8), 1))
    If can(i7, 2) = x1 Then GoTo conti77
      Next j8
  
    If can(i7, 3) = x2 Then
     ikumi = can(i7, 5)
            For j3 = 1 To ikumi
              If nb = can(i7, 5 + j3) Then
                 For k1 = j3 To ikumi
                 can(i7, 5 + k1) = can(i7, 6 + k1)
                 Next k1
                can(i7, 5) = ikumi - 1
                can(i7, 5 + ikumi) = ""
                Exit For
              End If
            Next j3
      End If
conti77:
   Next i7
ElseIf Left(f(i6), 1) = "R" Then
    x1 = Int(Right(f(i6), 1))
   
   For i7 = 1 To empty_cell
      For j8 = 1 To knum
       x2 = Int(Right(d(j8), 1))
    If can(i7, 3) = x2 Then GoTo conti7
      Next j8
    If can(i7, 2) = x1 Then
     ikumi = can(i7, 5)
            For j3 = 1 To ikumi
              If nb = can(i7, 5 + j3) Then
                 For k1 = j3 To ikumi
                 can(i7, 5 + k1) = can(i7, 6 + k1)
                Next k1
                can(i7, 5) = ikumi - 1
                can(i7, 5 + ikumi) = ""
                Exit For
              End If
            Next j3
      End If
conti7:
   Next i7
End If
Next i6

U search memoramdum (7) column_swordfish

chainr  matrix より縮小したjun matrix が作成された。次のステップとして、room に応じたmatrixの形式を選別する。例えば、swordfish は、room=3 であるが、3行でswordfishを構成するにはroomより少ない候補を持つセルでも成立する。
(2,2,2) (2,2,3) (2,3,3) (3,3,3) などである。ここで、列・行を候補の数が少ない順にわざわざ並べ替えた意味がわかるだろう。room=3の場合には、上に示した4つのケースに絞られる。

jun matrix より、room_selection マクロにより、swordfish に該当するmatrix が jnn matrixとして、導かれる。

column_swordfish は、jun matrix より、次のようにあらゆる組み合わせを検定して、抽出する。 
'
Sub column_swordfish()
 ksum = jun(z + 1, 0)
For i9 = 1 To ksum
 For j9 = i9 + 1 To ksum
  For k9 = j9 + 1 To ksum
    For m = 0 To z + 1
       jnn(m, 0) = jun(m, 0)
       jnn(m, 1) = jun(m, i9)
       jnn(m, 2) = jun(m, j9)
      jnn(m, 3) = jun(m, k9)
    Next m

      room_selection

    Next k9
  Next j9
Next i9
End Sub

ある組み合わせが該当するかどうかを調べる。
 Sub room_selection()

各行に対して候補を持つセルの数を調べて jnn の room+1列目に書き込む。
       For i3 = 1 To z
          inum = 0
        For j3 = 1 To room
          If jnn(i3, j3) <> "" Then
           inum = inum + 1
          End If
        Next j3
           jnn(i3, room + 1) = inum
        Next i3

該当する行の数を jnn matrix の右下のセル (z+1,room+1)にかきこむ。
         knum = 0
        For i4 = 1 To z
         If jnn(i4, room + 1) <> 0 Then
           knum = knum + 1
         End If
        Next i4
         jnn(z + 1, room + 1) = knum

判定条件は、この数が、room に一致することである。

     If knum > room Then
      Exit Sub
     ElseIf knum = room Then

該当する jnn matrix をoutput する。
       For i5 = 0 To z + 1
        For j5 = 0 To room + 1
           Sheets("Sheet8").Cells(6 + i5, 63 + room + j5) = jnn(i5, j5)
       Next j5
        Next i5

jnn matrix(z+1, room+1)  の output は次のようになります。






そして、つぎのマクロで、この同列にあるこの行の候補数字を消去する。

       column_fish_room_division

     Else
      MsgBox ("Qurious Case to be noticed !")
      Exit Sub
     End If
   End Sub
'

2013年6月4日火曜日

U search memoramdum (6) column_fish_judge

 ある数字(nb)に注目し、各行、各列にある候補の数を拡大matrix chainb に作成し、work area の chainc を使って、候補の数が少ない順に、行・列を並び替えた chainr matrix を作成しました。

room=3 は、関係するセルの数です。それ以上のものは関係なく取り除きます。新しく関係するセルだけを含む matrix jun を作成します。
'
Sub column_fish_judge()
  Erase chainc
 ReDim chainc(z + 1, z + 1)

chainr の最下行にある候補の数を調べて、room より多いのは省きます。
work area の chainc に借り置きします。

roomより少ない列がnumある。


 num = 0
 For j = 1 To z
     aa = chainr(z + 1, j)
  If aa = "" Or aa = 1 Then GoTo contj
  If aa <= room Then
   num = num + 1
   For k = 0 To z + 1
   chainc(k, num) = chainr(k, num)
   Next k
  End If
contj:
 Next j

左端の列のタイトルを移す。

 For i = 0 To z + 1
   chainc(i, 0) = chainr(i, 0)
 Next i

jun  jnn matrix 登場。
Erase jun, jnn
 ReDim jun(z + 1, z + 1), jnn(z + 1, z + 1)

先に作った絞り込み Matrix を jun に移す。

For i = 0 To z + 1
 For j = 0 To z + 1
 jun(i, j) = chainc(i, j)
 Next j
Next i

絞り込んだ列の数(roomより少ない関係する列)を 左下のセル(z+1,0)=num
に書き込む。

 num = 0
For j = 1 To z
If jun(z + 1, j) <> "" Then
 num = num + 1
End If
Next j
 chainc(z + 1, 0) = num
 jun(z + 1, 0) = num

room国同盟に足りない場合はおさらば。
三国同盟をするのに二国しか該当しない。

If jun(z + 1, 0) < room Then
Exit Sub
End If

同様の絞り込みを行に対しても行う。

For i = 1 To z
 inum = 0
 For j = 1 To z
 If jun(i, j) <> "" Then
   inum = inum + 1
 End If
 Next j
 jun(i, z + 1) = inum
 chainc(i, z + 1) = inum
Next i

room に応じて次のマクロに分かれる。

Select Case room
Case 2
 column_X_wing
Case 3
 column_swordfish
Case 4
 column_jellyfish
Case 5
 column_squirmbag
Case Else
 MsgBox ("This case available ! ")
End Select


2013年6月3日月曜日

U search memoramdum (5) select_number

 Select_number は3部屋を占有する組み合わせを求め易くするための、chainr matrixを作るマクロである。

chainb はCandy matrix を拡大したもので、次のサイズを持つ。

ReDim chainb(z + 1, z + 1), chainr(z + 1, z + 1)

z=9 、chainb(0,z+1),  (z+1,0) は、タイトル、(i,z+1),(z+1,j) は候補の数が入る。

matrixを空にする。   Erase chainb, chainr

chainb を作成する。  画面を chainb に移す。
 For i = 1 To z
  For j = 1 To z
   chainb(i, j) = Sheets("Sheet1").Cells(ppp + i, qqq + j)
  Next j
 Next i

 空白セルの候補を、 chainb に書き込む。
 For i = 1 To empty_cell
    ikumi = can(i, 5)
     i1 = can(i, 2): j1 = can(i, 3)
     candidate = ""
       For k = 1 To ikumi
     candidate = candidate & can(i, 5 + k)
       Next k
  chainb(i1, j1) = candidate
 Next i 

chainb の上に、C1,C2・・・ 左端に R1,R2,R3・・・を書き込む。
  For j = 1 To z
 chainb(0, j) = "C" & j
 chainb(j, 0) = "R" & j
  Next j

chainr の作成 chainbより、現在対象としている digit nb を抜き出す。
chainr は特定の候補に絞ったmatrix

For i = 1 To z
 For j = 1 To z
  k = Len(chainb(i, j))
 If k <> 1 Then
  For m = 1 To k
    If Int(Mid(chainb(i, j), m, 1)) = nb Then
    chainr(i, j) = nb
    End If
   Next m
 End If
 Next j
Next i

chainr にタイトルをつける。
For j = 1 To z
 chainr(0, j) = "C" & j
 chainr(j, 0) = "R" & j
Next j 

各行について、nbの数を持つセルの数を数えて、chainr(i,z+1) 一番右端に書き込む。

For i = 1 To z        'row i no kosuu
 num = 0
For j = 1 To z
If chainr(i, j) <> "" Then
num = num + 1
End If
Next j
 chainr(i, z + 1) = num
Next i

各列に対して、同様にセルの数を数えて、chainr (z+1, j) 一番下に書き込む。

For j = 1 To z         'column j no kosuu
 num = 0
For i = 1 To z
If chainr(i, j) <> "" Then
num = num + 1
End If
Next i
 chainr(z + 1, j) = num
Next j

chainr matrix はこのようになる。(Examle U-78 nb=7)


chainc の登場。
chainrを列、行を並び替えて、arranged matrix chainc を作成する。

 Erase chainc
 ReDim chainc(z + 1, z + 1)

行の並び替え。1,2,3、の順に候補の数が少ない順に上からchainc に書き込む。

   num = 0
 For kosu = 1 To z
  For i = 1 To z
 If chainr(i, z + 1) = kosu Then
   num = num + 1
   For j = 0 To z + 1
   chainc(num, j) = chainr(i, j)
   Next j
 End If
  Next i
 Next kosu

行の並び替えが終わると、それを chainr に戻す。
chaincは単なるwork area である。
 For i = 1 To z
  For j = 0 To z + 1
     chainr(i, j) = chainc(i, j)
  Next j
 Next i

同じことを、列に対して行う。

 Erase chainc
 ReDim chainc(z + 1, z + 1)
    num = 0
 For kosu = 1 To z
  For j = 1 To z
 If chainr(z + 1, j) = kosu Then
   num = num + 1
   For i = 0 To z + 1
      chainc(i, num) = chainr(i, j)
   Next i
 End If
  Next j
 Next kosu

列を並び替えた結果をchainc  から chainr に戻す。

 For i = 0 To z + 1
  For j = 1 To z
       chainr(i, j) = chainc(i, j)
  Next j
 Next i

kind="column"の場合にはこのまま終わる。




kind="row"の場合には chainr の転置行列にする。

 If kind = "row" Then
 For i = 0 To z + 1
  For j = 0 To z + 1
       chainc(j, i) = chainr(i, j)
  Next j
 Next i
 For i = 0 To z + 1
  For j = 0 To z + 1
       chainr(i, j) = chainc(i, j)
  Next j
 Next i
 End If



2013年5月19日日曜日

U search memoramdum (4) U_search

ここに、Usearch を例にとりメモとして残そうと企てる理由は3つある。

 一つは、本来の目的のそのアルゴリズムを今一度思い出し、メモとして書き記すためである。何しろプログラムを書いてから2年以上もたつというのに、そのプログラム本体以外に何もメモが残っていないからである。当時の記憶はだんだんと薄れていき、自分で書いたプログラムなのに、その意味が分からなくなってしまっている。ただそんなに詳しくは書くつもりはない。あくまでも私に対するメモで、他人にもすぐに理解できるような代物を目指したものではない。

 二つ目は、「次の一手」を説明できるようなコメントの部分を追加することにある。今の状態は答えは出てくるものの何故そうなるのかという情報のアウトプットがされていない。

 三つ目は、このルーチンのアルゴリズムを使って、拡張した探索法を見つけることである。実際、三次以上の Finned fish や Sasimi Fish などの技は今のアルゴリズムには含まれていない。そしてまた多重Chain や多重Loop といったものへの発展が期待される可能性の探査も含んでいる。

 U ( Sword fish) を例にとり、search flow を説明しよう。 

① U_search ( M45, 5 )
              > Ur_search    ( M45, 6)
              > Uc_search    ( M45, 7)

② Ur_search >  hot_candy
                           deform_Ur     ( M45,10)  
                           scf
                           Bcf

③ deform_Ur
                      room=3
                      row_fish_basic_deform  

④ row_fish_basic_deform  ( M45,  1)
                      basic_setting

    kind = "row"
    kind1 = "R"
    flagM = "fish" & kind1 & room

        For nb=1 to z
                      select_menber  ( M44, 1)
                      column_fish_judge ( M45 )
        Next nb

⑤ deform_Uc
                      room=3
                      column_fish_basic_deform  

⑥ column_fish_basic_deform  
      basic_setting
     kind = "column"
     kind1 = "C"
     flagM = "fish" & kind1 & room

    For nb = 1 To z
     select_number
     column_fish_judge
    Next nb

 To be continue
        

 

U search memorandum (3) search_type_choice

  ippatsu (M4) でまず、基本技の探索を search_process_choice (M4) で行う。基本技だけで決まる、Beginner, Very Easy,  Easy のレベルの問題はここで終了する。

次に、 > search_type_choice ( M4) において、技の種類別に次の macro に分かれる。

① search_macro (M41)         VQGP・・・・などの単独技
② combine_macro ( M41)      v w q g  ・・・などの組み合わせ技
③ playback_macro
④ A_birdy_search ( M4)       "?"
⑤ A_eargle_search ( M4)      "#"
⑥  Deform_candidate_search   "e"
⑦ destroy_macro                  "d"
⑧ extra_input_from_database  ( M4)  X
 
①の search_macro はそれぞれの記号別に次に示す具体的な search macro にうつる。
'
Sub search_macro()
 Range("AW1") = "search"
Select Case md(si5)
Case "V": V_search          '          M23
Case "W": W_search        '          M15
Case "Λ": Λ_search         '          M26
Case "Q": Q_search         '          M17
Case "G": G_search          '          M16
Case "P": P_search           '          M18
Case "Φ": Φ_search          '          M18
Case "K": K_search         '          M40
Case "S": S_search           '          M21
Case "Ξ": Ξ_search          '          M18
Case "Δ": Δ_search          '          M33
Case "H": H_search         '          M22
Case "Ω": Ω_search        '          M22
Case "Y": Y_search        '          M25
Case "Π": Π_search        '          M26
Case "Θ": Θ_search       '          M26
Case "L": L_search        '          M47
Case "T": T_search        '          M47
Case "U": U_search       '          M45
Case "N": N_search       '          M47
Case "O": O_search       '          M47
Case "J": J_search          '          M45
Case "F": F_seach         '          M47
Case "Z": Z_search       '          M47
Case "I": I_search         '          M45
Case "Γ": Γ_search       '          M33
'Case "?": Bcf               '          M41
 Case Else
     MsgBox ("No search name appear !  ")
 End Select
End Sub
'

2013年2月8日金曜日

search_process_choice

先に示した探索順序と種類の選択の他に簡単な技だけを使って行う「探索モード指定」が7種類ある。 この方法は、 Only_one_program >  complete >  ippatsu  > search_process_choice のマクロ順で実施される。

 Sheet 1 beg= 探索モードを B1 ~ B7 まで記号で指定する。

ただし、msd モードの時には、B2を指定する。まず最初に、基本技だけをこのマクロで探索。

B1: first_search_process (Module14)     BBB RRR CCC MMM

B2:  B2_search_process (Module39)     BBB RBBB RBBB CBBB RBBB CBBB MBBB

B3: B3_search_process (Module 39)    BBB MBBB RBBB CBBB

B4: B4_search_process (Module 39)    BBB VBBB RBBB CBBB MBBB

B5: B5_search_process (Module 39)    BBB VBBB QBBB RBBB CBBB MBBB

B6: B6_search_process (Module 39)    B2  BBB  VBBB QBBB GBBB RBBB CBBB MBBB

B7: B7_search_process (Module 39)    B2 VBBB QBBB GBBB PBBB UBBB

2013年2月6日水曜日

kind_order_search

Module 1 の basic_setting の次には kind_order_search で、strategy order を設定する。

まず、基本技の4種類は、 fmsd="BRCM" のように文字列として読み込み、 fd(i) に順番通りに分解される。

変形技は、いろいろな方法で、その計算順序が決定される。文字列で与えられた技は使用する技の順番に分解され md(i) に蓄えられる。

変形技の指定には次の7種類がある。 

(1) from J    data sheet の J 欄に示した技を読み込む。

(2)  from  I   strategy level により実行する。 ”Lovely”   なら  msd="VWQG"を設定する。

(3)  from E   published level により実行する。  ★7 なら  msd=msd1  を実行する。

(4)  from X   あらかじめ定めた探索技と順序の呼称で実行する。
     ”まんだら”:  msd=
"WVΛQGPΦΔKSΞHΩYVΛQGPΔKSΞHΩYvwqgpφksξhωvVqQgGpPφPξkKsShHΩωLTUltuA"
     "きてれつ":   msd = "WVQGPVΛΦKSΞHΩYA"

(5) from AJ    基本技 fmsd をSheet1 のAJ欄に記入して実行する。

(6)  from  GJ  data base に入っている技の数と種類だけを実行する。  

(7) from  AF8  Sheet 1 に使用する技をインプットして、それだけを実行する。