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