s: make_random_state(true); set_random_state(s); 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() := ([n: 100, M: zeromatrix(9, 9), K: zeromatrix(9, 9), T: zeromatrix(9, 9)], if not (integerp(x) and x > 0) then x: 10, 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: 1 thru 9 do K[k][a]: 1, M[i][a]: l ) ) ), K: copymatrix(M), T: copymatrix(M) ), if n < 0 then n else M );