2014年7月6日日曜日

full_number_check (2)

 このマクロは、盤面にある数字のパターンより、

 (1) 数字の分布
 (2) B数 (各Blockにある数字の個数)
  (3) R数 (各行にある数字の数)
 (4) C数 (各列にある数字の数) 

をカウントするものである。

このマクロを使って作成された鉛筆で解く数独記録ソフト(BS:Brain Simulation)の使用法を紹介しよう。

まず、問題番号を入力すると、開始画面として次のような盤面が表れる。



3                              C D  E  F  G  H   I    J    K  L   M  N  O   P
17 

ここに、 C6~C14 は、数字の個数、例えば 3の数字は4個あり、8とともに最も多い。

      D6~D14 は、B数を表す。例えば中央 Block 5 は3個の数字よりなる。

      O6~O14 は、R数を表す。例えば、1行目には 5個の数字がある。

      F5~N5  は、C数を表す。例えば、1列目には 3個の数字がある。

操作の方法は、 
     (1) 答えを入れるセルをクリック。  (4、7)をクリック。
     (2) 使用する技(P6~P14)をダブル・クリック。 P16に記号が入る。 Bをクリック。
     (3) 16行の水色のセルの数字をクリック。 3をクリック。
     (4) 「確認」をクリック。

 これで、 Step1 (4,7)=3  B と経過時間が、Sheet5に記録される。

以下同様に進めると、 Step28 で次の画面となっている。




full_number_check は、各stepにおいて書きかえられ、表出数(赤色18font)と既決数(青色14font)のみがカウントの対象になる。 フォント12の小さな文字は、借り置きのHidden pair である。

BRC数が7個以上になると、フォントが大きく表示される。取りこぼしを知らせてくれる。

最終盤面は、次のようになります。



Sheet 5 に記録された途中経過(決定順序と時間)は、Graph で表示される。

「次の一手」で示されている鉛筆による解析例はすべてこのソフトによるものである。 





2014年7月1日火曜日

full_number_check (1)

transfer_problem  (M3) >  full_number_check (M27)
                                    >  kosu_in_unit (M27)
                                   >  iblock_search (m27)

数独の表出数字の1~9 までの数字別個数をカウントする。

また9つあるブロック内の数字の個数(B 数)、行内の数字の個数(R数)、列内の数字の個数(C数)をカウントする。

計算した結果の一例を示す。




このマクロは直接数独の解法に寄与するものではない。

龍涎ソフトでは、数独の格付けに必要な「見た目」の表現に使われる。すなわち、数字の形のもつ美しさの評価を表すアロマ・インプレションやLack DigitはVisual point に関係する。上の例では、表出数の中の数字で、40%が、3689の丸味を帯びた数字(round shaped digit)であり、見た目の印象では全体的に円満なやさしい感じを与えるパターンであることを示している。

B数を求めるアルゴリズムは少しばかり手間のかかるものであるので、次に示しておこう。

iblock_search マクロは、掃引するBlock の開始のセル( igs , jgs )と最後のセル(ige ,jge) を与えるものである。

Sub iblock_search()
ps = 3
pt = 3
nn = Int((cigrp - 1) / ps)
n = nn + 1
igs = ps * nn + 1
ige = ps * n
jgs = (cigrp - nn * ps - 1) * pt + 1
jge = (cigrp - nn * ps) * pt
End Sub



2014年6月11日水曜日

keisen


 このkeisenマクロは、Sheet 1 の EXCEL画面に盤面を描くものである。



 盤面とは、セルを区切る細い線とブロックを囲む太い線だけであるので、簡単なようだが EXCEL画面上にVBAで描かせるのは意外と難しいので、そのマクロ本体を下に紹介することとしよう。「コピペ」することで、 任意のナンプレ画面を描くことができます。

Sub keisen()
 Application.ScreenUpdating = False
 ars = ricj((ppp + 1), (qqq + 1))
 are = ricj((ppp + z), (qqq + z))
 ar = ars & ":" & are
  Range(ar).Borders.LineStyle = xlContinuous
For i = 1 To pt
 arrs = ricj((ppp + (i - 1) * ps + 1), (qqq + 1))
 arre = ricj((ppp + i * ps), (qqq + z))
 arr = arrs & ":" & arre
  Range(arr).BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
Next i
For j = 1 To ps
 accs = ricj((ppp + 1), (qqq + (j - 1) * pt + 1))
 acce = ricj((ppp + z), (qqq + j * pt))
 acc = accs & ":" & acce
  Range(acc).BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
Next j
'
 ars = ricj((ppp + 1), (qqq + 1))
 are = ricj((ppp + z), (qqq + z))
 ar = ars & ":" & are
  Range(ar).BorderAround LineStyle:=xlContinuous, Weight:=xlThick
 Application.ScreenUpdating = True
End Sub
'
Function ricj(i, j)
If j <= 26 Then
  jc = j
  ricj = qt(jc) & i
ElseIf j <= 52 Then
 jc = j - 26
  ricj = "A" & qt(jc) & i
ElseIf j <= 78 Then
 jc = j - 52
  ricj = "B" & qt(jc) & i
ElseIf j <= 104 Then
 jc = j - 78
  ricj = "C" & qt(jc) & i
Else
 MsgBox ("You indicate too large RANGE !!")
End
End If
End Function
'
Function qt(jc)
Select Case jc
 Case 1: qt = "A": Case 2: qt = "B": Case 3: qt = "C": Case 4: qt = "D": Case 5: qt = "E"
 Case 6: qt = "F": Case 7: qt = "G": Case 8: qt = "H": Case 9: qt = "I": Case 10: qt = "J"
 Case 11: qt = "K": Case 12: qt = "L": Case 13: qt = "M": Case 14: qt = "N": Case 15: qt = "O"
 Case 16: qt = "P": Case 17: qt = "Q": Case 18: qt = "R": Case 19: qt = "S": Case 20: qt = "T"
 Case 21: qt = "U": Case 22: qt = "V": Case 23: qt = "W": Case 24: qt = "X": Case 25: qt = "Y"
 Case 26: qt = "Z"
End Select
End Function

 ここに、(ppp,qqq) はSheet 1 上の盤面の原点の位置(左上のセルの座標)を表し、ps,pt はそれぞれ1ブロックの縦方向(行)および横方向(列)のセルの数を表す。また、z=ps*pt はナンプレの大きさを表す。これらの数値はbasic_settingで設定する。

ノーマル・ナンプレでは、9×981のセルを細線で囲み、3×39個のブロックを太線で囲む。すなわち、ps=pt=3 ,z=9 である。

16×16 大型ナンプレの場合、 ps=pt=4  z=16 
28×28 変形ナンプレの場合、 ps=4pt=7  z=28  である。

なお、このマクロは、EXCEL/VBA/2007 以前に対応するもので、列番号のアルファベットを数字に直す Function を使っています。

最後に、変形ナンプレ(全体12×12、ブロック 3×4)を keisen マクロを使って描いた例を示します。この場合、上のマクロにおいて、ps=3, pt=4, z=12 とおきます。



2014年6月1日日曜日

font_size_color

 マクロ font_size_color ( Sheet 1) および font_size_color_Sheet16 ( Sheet16) は、盤面内での数字(digit) の大きさと色により、その数字の持つ性質を区別する。

盤面のセルの色は、薄いダイダイ色で、
 表出数(Givens)は、 Font 18  Color 3 赤 
 決まった数(Answer)は、Font 14 Color 5 青
 候補の数(Candidate)は、Font 12 Color 1 黒
とする。

Sub font_size_color()
 Application.ScreenUpdating = False
  For i = 1 To z
    For j = 1 To z
      With Sheets("Sheet1").Cells(ppp + i, qqq + j)
      .Interior.ColorIndex = 36
      .Font.Bold = True
  If .Value = "" Then
      .Font.ColorIndex = 5
      .Font.Size = 14
  ElseIf IsNumeric(.Value) = False Then
      .Font.ColorIndex = 1
      .Font.Size = 12
  Else
      .Font.ColorIndex = 3
      .Font.Size = 18
  End If
      End With
    Next j
   Next i
 Application.ScreenUpdating = True
End Sub


 
 実例として、朝日新聞5月31日★5の問題を鉛筆で解く場合の盤面を表す。





局面は第2手目で「予約」(Hidden pair)で (7,2)=3 が決まるところである。
1手目は、「ブロッケン」Hidden Single で決まった (9,8)=3 が青色で示されている。
Hidden Pair Method では、各Block内での (HiddenPair を小さいfont で示している。

digit 1 から順にやっていくと、8 の段階で上の図の局面に到達する。Block 7 (左下)において、(7,1)=1368  の候補をもち、(8,3) =18 のセルと合わせて、「予約」Hidden pair of Block が完成して、(7,1)=18 となり、3および6が消去される。その結果、(7,2)=3Hidden Single になる。

また、(9,1)=6 もHidden Single となり、第3手目が決まる。同様に第4手目(9,2=5 も決まることになる。



2014年5月29日木曜日

kind_order_search

 このマクロでは、どの順番でどの技を検討するかの順番を指定する。

                            AE
Sheet 1 の AH1 のセルに input_form を代入する。AE2~AE8をダブルクリックすると、AE1にその文字が入る。

2014年5月27日火曜日

transfer_probrem

 マクロ transfer_problem は isheet に貯えられた データを Sheet 1 の盤面に移す他にさまざまな設定を行う。

 マクロは次の順番で実施される。

 Transfer_problem
 
         > basic_setting M1
         基本設定(前出) 

         > kind_order_search (M1
         技をかける種類と順番をいろいろな方法で設定する。
 
   > hot_candy (M4
          Candidate matrix や g-matrix を作成する。

    > font_size_color (M10
          Sheet 1 の盤面において、表れる数字の大きさや色を決める。

    > font_size_color_Sheet16 (M10
          Sheet 16 で同様の設定をする。

    > keisen (M10
         Sheet 1 の盤面にブロック境界、セル境界にそれぞれ太字、細字の線をひく。        
       > num_of_cells (M6)
          Givens の数、empty cellの数を求める。

    > full_number_check (M27
          > kosu_in_unit (M27)

            diagonal_vacua (M27)

    > aroma_impression (M53)
         数字の形状による印象を数値化して%で表し点数を計算する。
    > symmetry_check (M27)
               7種類の図形の対称性を判定し、対称点数を求める。
    > number_of_entrance (M29)
            初期段階で基本技で取れるセルの個数を求める。

    > search_order_list (M29)
            設定された技をかける順番 md(imm) をSheet 6 にoutput する。








2014年5月15日木曜日

number_distribution

 計算を行う時には、先に格納した問題をDatabase Sheet より Sheet 1に呼び出しておく。それには Fig. 8 の Diagram の上にあるコマンド Input Problem をクリックする。
 このとき呼び出されるマクロが、この Number_distribution である。

 このマクロでは、
 number_distribution
    > clear_table
    > transfer_problem
    > minimam_givens_for_present_diagram
    > artistic_point

のように初期セットの他にいくつかの準備計算やLooks に関するポイント計算がおこなわれる。

      Fig.8   Call the Problem from Databese ( Sheet 6 ) by clicking command bottum "Input Problem" 

2014年5月11日日曜日

basic_setting



 basic_setting のマクロは 計算に必要な基本情報を設定するマクロである。

 計算を実行する前に 下図 のピンクの文字のように設定する。使用できる文字または数字は、周りにある該当するものを Double Click する。

        S  T U                AE                       AN    AP 



 isheet   Sheet 1   “S1”    入力Data のあるSheet 番号
dsheet  Sheet 1   “U1”    出力Data のあるSheet 番号

 ver    Sheet 1    “AN1”   Version を選択
beg     Sheet 1     “AP1”  各種の技(Strategy)を試す方法を選択

mondai  Sheet 1   “D2”    isheet の当該問題の記載の行番号

ppp=2 , qqq=10   Sheet 1 の Diagram (盤面)の原点となるセル位置
 Sheet 1 の 盤面 ( i , j ) のセルは、 Cells ( ppp+I , qqq+j ) で表す。
ppA=6 , qqA=2   Sheet 2 の盤面の原点の位置。

msga   Sheet 1  “C9”   計算を制御する記号
msgt    Sheet 1  “B9”  技の選択肢を制御する記号

fmsd   Sheet 1   “AS1”  基本技を設定する。
input_form  Sheet 1 “AE1”   技の順番の方法を指定する

pt=3 , ps=3  Block の 縦横のサイズを指定する。
z=pt*ps=9  
通常サイズナンプレは、9*981なので、z=9
16×16 ナンプレの場合には、 pt=ps=4, z=16.
 この数字を換えることで、大型ナンプレ、変則ナンプレに対応できる。