Sudoku パズルの入力データとして次の行列 ini で与えられ、それを解き始めた途中の状態のデータが mat の場合に、数字を2色で表示する関数 plotGame2c を作った。次に完成した図を示します。紫色の数字は最初の数字で、青色の数字は解いたものです。
入力データと関数の使用例です。
ini = Module[{b},{
{b,b,4, 6,b,b, b,5,b},
{8,2,b, b,b,b, 9,b,b},
{b,b,b, b,b,4, b,b,b},
{b,b,b, 1,2,b, b,6,7},
{b,b,7, b,b,b, 3,b,b},
{5,1,b, b,7,8, b,b,b},
{b,b,b, 9,b,b, b,b,b},
{b,b,8, b,b,b, b,9,2},
{b,9,b, b,b,3, 7,b,b}}/.b->Null];
mat = Module[{b}, {
{b,b,4, 6,b,b, b,5,b},
{8,2,b, b,b,b, 9,4,6},
{b,b,b, b,b,4, b,7,b},
{b,b,b, 1,2,b, b,6,7},
{2,b,7, b,b,b, 3,b,b},
{5,1,6, 3,7,8, 4,2,9},
{b,b,b, 9,b,b, b,3,b},
{b,b,8, b,b,b, b,9,2},
{b,9,b, b,b,3, 7,b,b}} /. b -> Null];
plotGame2c[ini, mat]
プロットする関数は次です。引数として行列を使うことを明示的に定義している。
パラメータは FontSize と ItemSize および Spacings の値です。
plotGame2c[ini_?MatrixQ, mat_?MatrixQ] := Module[{solSet={}},
Do[
If[mat[[i,j]]=!=ini[[i,j]],AppendTo[solSet,{mat[[i,j]],{i,j}}]],{i,1,9},{j,1,9}];
Grid[mat,
ItemStyle -> {Directive[FontSize -> 25, Purple, Bold], Automatic,
Thread[solSet[[All, 2]] -> Table[Blue, {Length[solSet]}]]},
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.5}]
]
関数 Grid の詳しい説明は ドキュメントセンターに載っています。
まとめ
- これで数字を2色で表示することができた。
- その他も同様にできることが分かったがパラメータのチューニングが残っている。