f(x, y) := block([dx, dy], dx: divide(x + 2, 3), dy: divide(y + 2, 3), [dx[1] * 3 + dy[1] - 3, dx[2] * 3 + dy[2] + 1] ); sudoku_pre1() := ([a, M: zeromatrix(9, 9) ], for i: 1 thru 9 do ( a: random(9) + 1, M[i][a]: 1 ), M ); sudoku_pre2() := ([a, p, M: zeromatrix(9, 9), K: zeromatrix(9, 9) ], for i: 1 thru 9 do ( p: 0, for j: 1 while (p = 0) do ( a: random(9) + 1, if K[i][a] = 0 then ( p: 1, for k: i thru 9 do K[k][a]: 1, M[i][a]: 1 ) ) ), M ); sudoku_pre3() := ([a, p, d, M: zeromatrix(9, 9), K: zeromatrix(9, 9) ], for i: 1 thru 9 do ( p: 0, for j: 1 while (p = 0) do ( a: random(9) + 1, if K[i][a] = 0 then ( p: 1, for k: 1 thru 9 do ( d: f(f(i, a)[1], k), K[d[1]][d[2]]: 1 ), for k: i thru 9 do K[k][a]: 1, M[i][a]: 1 ) ) ), M ); /* sudoku_pre4() := ([a, p, d, M: zeromatrix(9, 9), K: zeromatrix(9, 9) ], for l: 1 thru 9 do ( for i: 1 while(i <= 9) do ( p: 0, for j: 1 while (p = 0) do ( a: random(9) + 1, if K[i][a] = 0 then ( p: 1, for k: 1 thru 9 do ( d: f(f(i, a)[1], k), K[d[1]][d[2]]: 1 ), for k: i thru 9 do K[k][a]: 1, M[i][a]: l ) ) ), K: copymatrix(M) ), M ); */ sudoku_pre5() := ([a, p, d, q, M: zeromatrix(9, 9), K: zeromatrix(9, 9) ], for l: 1 thru 9 do ( q: 0, for i: 1 while (i <= 9 and q = 0) do ( p: 0, for j: 1 while (p = 0 and q = 0) do ( a: random(9) + 1, if not member(0, K[i]) then ( q: 1 ) else ( if K[i][a] = 0 then ( p: 1, for k: 1 thru 9 do ( d: f(f(i, a)[1], k), K[d[1]][d[2]]: 1 ), for k: i thru 9 do K[k][a]: 1, M[i][a]: l ) ) ) ), K: copymatrix(M) ), M ); sudoku_pre6() := ([a, p, d, q: 0, M: zeromatrix(9, 9), K: zeromatrix(9, 9) ], for l: 1 while (l <= 9 and q = 0) do ( q: 0, for i: 1 while (i <= 9 and q = 0) do ( p: 0, for j: 1 while (p = 0 and q = 0) do ( a: random(9) + 1, if not member(0, K[i]) then ( q: 1 ) else ( if K[i][a] = 0 then ( p: 1, for k: 1 thru 9 do ( d: f(f(i, a)[1], k), K[d[1]][d[2]]: 1 ), for k: i thru 9 do K[k][a]: 1, M[i][a]: l ) ) ) ), K: copymatrix(M) ), M ); sudoku() := ([a, p, d, q, n: 100, M: zeromatrix(9, 9), K: zeromatrix(9, 9), T: zeromatrix(9, 9)], for l: 1 while (l <= 9 and n >= 0) do ( n: n - 1, q: 0, for i: 1 while(i <= 9 and q = 0) do ( p: 0, for j: 1 while (p = 0 and q = 0) do ( a: random(9) + 1, if not member(0, K[i]) then ( q: 1, l: l - 1, K: copymatrix(T), M: copymatrix(T) ) else ( if K[i][a] = 0 then ( p: 1, for k: 1 thru 9 do ( d: f(f(i, a)[1], k), K[d[1]][d[2]]: 1 ), for k: i thru 9 do K[k][a]: 1, M[i][a]: l ) ) ) ), K: copymatrix(M), T: copymatrix(M) ), if n < 0 then n else M );