Sudoku(数独) を Mathematicaで解く(5): Coloring

目次へ

5.1  数独格子の数字に色をつける

数独格子(グリッド)に埋めこんだ数字に色を付けて分かりやすく表示する方法について説明する。

新しい関数 plotGameSeq の定義を以下に示す。

plotGameSeq[ini_?MatrixQ,xylist:{{_,_}..}]:=Grid[ini,
  ItemStyle->{Directive[FontSize->25,Darker[Blue],Bold],Automatic,Thread[xylist->Table[Pink,{Length[xylist]}]]},
  ItemSize->{2.5,2.5},Dividers -> {{{Thickness[2],True,True}},{{Thickness[2],True,True}}},
  Background -> {Automatic,Automatic,
  Flatten[Table[{i, j} -> If[EvenQ[Plus @@ Floor[{i - 1, j - 1}/3]], 
  LightGreen, White], {i, 9}, {j, 9}]]},Spacings->{0,0.45}] 
ini2=makeMatrixByNakedSingle[ini]; (* これを実行すると rules が作られる *)
xylist=First[#]&/@rules;    (* 追加された数字の位置のリスト *)
Show[Rasterize[plotGameSeq[ini2, xylist]], ImageSize -> 250]

グラフの大きさを調整するため、関数 Rasterize で画像データに変換した後に表示している。

5.2  候補図(map)の数字に色をつける

候補図の中でNakedSingle(裸のシングル)を黄色で表示する関数を定義する。 plotGridsColoredByNakedSingle その準備として補助関数の定義を必要とするので合わせて示す。

(*   Coloring  *)
gridBox[lst_List]:=Grid[Partition[ReplacePart[Table[blank,{9}],Thread[lst->lst]],3]/.blank->Null]

makeGrids[mapini_]:=Table[gridBox[mapini[[i,j]]],{i,1,9},{j,1,9}]

coloring2[grids_,{nums_List,{i_,j_}},bkg_:Green,moji_:Black]:=Module[{tmp},
  tmp=grids;
  tmp[[i,j]]=grids[[i,j]]/.Flatten[{#->Item[Style[#,moji], Background -> bkg]}&/@nums,1];
  tmp
]

makeGridsColored[grids_,colors_,bkg_String]:=Module[{moji},
  Which[bkg=="Green",
  Fold[coloring2[#1,#2,Symbol[bkg],Black]&,grids,colors],
  bkg=="Yellow",
  Fold[coloring2[#1,#2,Symbol[bkg],Red]&,grids,colors]
 ]
]

plotGridsColored[ini_,grids_]:=Module[{numbers,mapgrid},
  numbers=DeleteCases[Flatten[Table[If[ini[[i,j]]=!=Null,{i,j}->ini[[i,j]],"aa"],{i,1,9},{j,1,9}],1],_?StringQ];
  mapgrid=ReplacePart[grids,numbers];
  Grid[mapgrid,
    ItemStyle->{Directive[Blue,13,Bold],Automatic,Thread[numbers[[All,1]]->Table[Directive[Blue,30,Bold],{Length[numbers]}]]},
    ItemSize->{3.4,3.6},Dividers -> {{{Thickness[2],True,True}},{{Thickness[2],True,True}}},
    Background -> {Automatic,Automatic,
    Flatten[Table[{i, j} -> If[EvenQ[Plus @@ Floor[{i - 1, j - 1}/3]], 
   LightGreen, White], {i, 9}, {j, 9}]]}
 ]
]
(*  plotMapGridsColoredByNakedSingle[ini_]   *)
plotMapGridsColoredByNakedSingle[ini_] := Module[{mapini, delList, grids},
  mapini = makeMap[ini];
  delList = findNakedSingleColor[mapini];
      grids = makeGridsColored[makeGrids[mapini], delList, "Yellow"];
  plotGridsColored[ini, grids]
  ]
  
Show[Rasterize[plotMapGridsColoredByNakedSingle[ini]],ImageSize->350]

5.3  関数のまとめ

数字に色をつけてプロットする関数

  • plotGameSeq[ini_,xylist:{{_,_}..}]
  • plotMapGridsColoredByNakedSingle[ini_]

補助関数

  • gridBox[lst_List]
  • makeGrids[mapini_]
  • coloring2[grids_,{nums_List,{i_,j_}},bkg_:Green,moji_:Black]
  • makeGridsColored[grids_,colors_,bkg_String]
  • plotGridsColored[ini_,grids_]

続く

NakedSingle(裸のシングル) が見つからない場合、HiddenSingle(隠れたシングル)を探す。この前に整理を行う。

目次へ