xref: /sqlite-3.40.0/ext/wasm/sql/001-sudoku.sql (revision 49cb8d73)
1WITH RECURSIVE
2  input(sud) AS (
3    VALUES('53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79')
4  ),
5  digits(z, lp) AS (
6    VALUES('1', 1)
7    UNION ALL SELECT
8    CAST(lp+1 AS TEXT), lp+1 FROM digits WHERE lp<9
9  ),
10  x(s, ind) AS (
11    SELECT sud, instr(sud, '.') FROM input
12    UNION ALL
13    SELECT
14      substr(s, 1, ind-1) || z || substr(s, ind+1),
15      instr( substr(s, 1, ind-1) || z || substr(s, ind+1), '.' )
16     FROM x, digits AS z
17    WHERE ind>0
18      AND NOT EXISTS (
19            SELECT 1
20              FROM digits AS lp
21             WHERE z.z = substr(s, ((ind-1)/9)*9 + lp, 1)
22                OR z.z = substr(s, ((ind-1)%9) + (lp-1)*9 + 1, 1)
23                OR z.z = substr(s, (((ind-1)/3) % 3) * 3
24                        + ((ind-1)/27) * 27 + lp
25                        + ((lp-1) / 3) * 6, 1)
26         )
27  )
28SELECT s FROM x WHERE ind=0;
29