Re: A Su Doku solver
- To: mathgroup at smc.vnet.net
- Subject: [mg60614] Re: A Su Doku solver
- From: "Valeri Astanoff" <astanoff at yahoo.fr>
- Date: Thu, 22 Sep 2005 02:08:09 -0400 (EDT)
- References: <200509191007.GAA25694@smc.vnet.net><dgol73$hoa$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Dear Mr. Zhe Hu, With a couple of modifications, my onepager can now solve your grid : doku[tab_List /; Length[tab] == 9]:= Module[{}, loctab = tab; toDrop[n_,i_,j_]:= MemberQ[loctab[[i]] // Select[#,Length[#] == 1&]&,{n}]|| MemberQ[loctab[[All,j]] // Select[#,Length[#] == 1&]&,{n}]|| MemberQ[sq[loctab,i,j] // Flatten[#,1]&// Select[#,Length[#] == 1&]&,{n}]; Do[If[Length[loctab[[i,j]]]>1,loctab[[i,j]]= Select[loctab[[i,j]],Not[toDrop[#,i,j]]&]],{i,1,9},{j,1,9}]; loctab]; g1 = {1,2,3}; g2 = {4,5,6}; g3 = {7,8,9}; t1[i_]:=MemberQ[g1,i]; t2[i_]:=MemberQ[g2,i]; t3[i_]:=MemberQ[g3,i]; sq[tab_List /;Length[tab] == 9,i_Integer,j_Integer]:=Which[ t1[i] && t1[j], tab[[g1]] [[All,g1]], t1[i] && t2[j], tab[[g1]] [[All,g2]], t1[i] && t3[j], tab[[g1]] [[All,g3]], t2[i] && t1[j], tab[[g2]] [[All,g1]], t2[i] && t2[j], tab[[g2]] [[All,g2]], t2[i] && t3[j], tab[[g2]] [[All,g3]], t3[i] && t1[j], tab[[g3]] [[All,g1]], t3[i] && t2[j], tab[[g3]] [[All,g2]], t3[i] && t3[j], tab[[g3]] [[All,g3]], True,Print["err i=",i," j=",j] ]; sudoku[gri_List?MatrixQ /; Length[gri] == 9 ]:= Module[{}, tab = gri/.{0 -> Range[9],n_Integer/;n>0 -> {n}}; fp = FixedPoint[doku, tab] ; sel[row_List]:=(ou = Outer[List, Sequence@@(li = row)] // Flatten[#,Length[li]-1]&; Union /@ (Select[ou, Total[#] == 45 && #.# == 285&] // Transpose)); selrow = sel /@ fp; selcol = Transpose[sel /@ Transpose[selrow]]; fp2 = FixedPoint[doku, selcol] ; fp2 /. {n_Integer} -> n ]; A run with your test grid : mygrid = { {0,6,0,1,0,4,0,5,0}, {0,0,8,3,0,5,6,0,0}, {2,0,0,0,0,0,0,0,1}, {8,0,0,4,0,7,0,0,6}, {0,0,6,0,0,0,3,0,0}, {7,0,0,9,0,1,0,0,4}, {5,0,0,0,0,0,0,0,2}, {0,0,7,2,0,6,9,0,0}, {0,4,0,5,0,8,0,7,0}}; s = sudoku[mygrid] // Timing Out[10]= {0.141 Second, {{9,6,3,1,7,4,2,5,8}, {1,7,8,3,2,5,6,4,9}, {2,5,4,6,8,9,7,3,1}, {8,2,1,4,3,7,5,9,6}, {4,9,6,8,5,2,3,1,7}, {7,3,5,9,6,1,8,2,4}, {5,8,9,7,1,3,4,6,2}, {3,1,7,2,4,6,9,8,5}, {6,4,2,5,9,8,1,7,3}}} Thanks again for the challenge. Valeri Astanoff
- References:
- A Su Doku solver
- From: "Valeri Astanoff" <astanoff@yahoo.fr>
- A Su Doku solver