⍝ Solution vector for Sudoku problem ⍵: s33←0 9⍴0 ⍝ sample problem s33⍪←0 0 1 6 9 0 5 0 0 s33⍪←4 0 0 2 7 0 0 0 1 s33⍪←0 7 0 0 0 0 0 9 0 s33⍪←0 0 0 0 0 0 0 3 0 s33⍪←0 0 0 4 3 0 0 0 7 s33⍪←0 0 0 7 8 0 6 0 0 s33⍪←0 0 6 0 0 0 8 0 0 s33⍪←0 2 0 1 4 0 0 6 0 s33⍪←0 1 0 3 5 0 0 4 0 sbox←{⎕IO←0 ⍝ Box sudoku grids. ⍺←(⍴⍵)*÷2 ⍝ default square cells. vp hp←0=⍺|⍳¨⍴⍵ ⍝ vert and horiz partition vectors. numbs←⍉↑vp∘(⊂[0])¨hp⊂⍵ ⍝ numeric sub-areas. width←2+⌊10⍟⌈/1,,⍵ ⍝ digits per number. fmt←width∘{⍵=0:⌽⍺↑'·' ⋄ ⍺ 0⍕⍵} ⍝ dots for zeros. cells←0 1∘↓¨↑∘(,/)¨fmt¨¨numbs ⍝ char matrix sub-areas. hv←⍺⍴¨⊂¨⌽(⍴⊃cells)/¨'│─' ⍝ vert and horiz boundaries. in←{↑⍺{⍺,⍺⍺,⍵}/⍵} ⍝ ⍺ separates ⍵. (t m b)lr←'┬┼┴' '├┤'in¨∘⊂¨hv ⍝ bordering lines. body←m in⍉¨⊂[1 2]'│'in cells ⍝ collected cells. (⍉body in t b)in lr in¨'┌└' '┐┘' ⍝ boxed grid. } sbox s33 ⍝ show sample problem. ┌─────┬─────┬─────┐ │· · 1│6 9 ·│5 · ·│ │4 · ·│2 7 ·│· · 1│ │· 7 ·│· · ·│· 9 ·│ ├─────┼─────┼─────┤ │· · ·│· · ·│· 3 ·│ │· · ·│4 3 ·│· · 7│ │· · ·│7 8 ·│6 · ·│ ├─────┼─────┼─────┤ │· · 6│· · ·│8 · ·│ │· 2 ·│1 4 ·│· 6 ·│ │· 1 ·│3 5 ·│· 4 ·│ └─────┴─────┴─────┘ ⍕sbox¨sudoku s33 ⍝ display all solutions ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ │3 8 1│6 9 4│5 7 2│ │2 8 1│6 9 3│5 7 4│ │2 8 1│6 9 3│5 7 4│ │4 6 9│2 7 5│3 8 1│ │4 6 9│2 7 5│3 8 1│ │4 6 9│2 7 5│3 8 1│ │2 7 5│8 1 3│4 9 6│ │3 7 5│8 1 4│2 9 6│ │5 7 3│8 1 4│2 9 6│ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ │7 9 4│5 6 2│1 3 8│ │7 9 2│5 6 1│4 3 8│ │7 9 2│5 6 1│4 3 8│ │6 5 8│4 3 1│9 2 7│ │6 5 8│4 3 9│1 2 7│ │6 5 8│4 3 9│1 2 7│ │1 3 2│7 8 9│6 5 4│ │1 3 4│7 8 2│6 5 9│ │1 3 4│7 8 2│6 5 9│ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ │5 4 6│9 2 7│8 1 3│ │5 4 6│9 2 7│8 1 3│ │3 4 6│9 2 7│8 1 5│ │9 2 3│1 4 8│7 6 5│ │9 2 3│1 4 8│7 6 5│ │9 2 5│1 4 8│7 6 3│ │8 1 7│3 5 6│2 4 9│ │8 1 7│3 5 6│9 4 2│ │8 1 7│3 5 6│9 4 2│ └─────┴─────┴─────┘ └─────┴─────┴─────┘ └─────┴─────┴─────┘ s22←0 4⍴0 ⍝ sample 2×2 problem s22⍪←0 2 3 4 s22⍪←3 0 0 0 s22⍪←2 0 0 0 s22⍪←4 0 0 0 ⍕sbox¨sudoku s22 ⍝ display all solutions ┌───┬───┐ ┌───┬───┐ ┌───┬───┐ │1 2│3 4│ │1 2│3 4│ │1 2│3 4│ │3 4│2 1│ │3 4│1 2│ │3 4│1 2│ ├───┼───┤ ├───┼───┤ ├───┼───┤ │2 1│4 3│ │2 1│4 3│ │2 3│4 1│ │4 3│1 2│ │4 3│2 1│ │4 1│2 3│ └───┴───┘ └───┴───┘ └───┴───┘ s44←0 16⍴0 ⍝ sample 4×4 problem s44⍪← 3 6 0 0 0 0 4 15 12 11 13 2 8 0 5 0 s44⍪← 0 0 15 0 1 0 14 0 0 0 8 0 13 0 0 0 s44⍪← 0 14 13 0 0 8 10 0 0 16 5 0 0 0 0 0 s44⍪← 0 5 4 0 0 0 0 0 0 0 0 7 3 11 0 2 s44⍪← 0 0 9 0 0 7 0 0 0 0 3 10 6 4 0 0 s44⍪← 0 11 0 0 4 13 0 0 0 0 0 0 7 15 10 8 s44⍪← 0 0 0 0 15 0 0 0 0 0 6 4 11 0 14 0 s44⍪← 0 15 0 0 0 0 6 0 13 2 0 0 9 12 0 0 s44⍪←12 1 0 0 0 3 0 6 9 4 14 8 5 0 0 0 s44⍪← 0 0 0 0 13 2 0 12 0 5 10 3 1 14 9 0 s44⍪← 2 0 0 9 0 5 0 0 11 12 7 0 0 8 15 0 s44⍪← 0 0 8 14 0 4 7 11 1 13 0 0 0 0 0 0 s44⍪← 4 0 0 0 3 0 16 0 0 6 0 0 0 0 0 0 s44⍪←16 7 12 13 14 9 0 2 8 0 0 0 0 10 0 0 s44⍪←11 0 1 0 0 15 0 0 0 0 0 0 0 5 0 0 s44⍪←15 8 0 0 6 0 5 10 3 0 0 0 0 7 11 0 ⍕sbox¨ sudoku s44 ⍝ display all solutions ┌───────────┬───────────┬───────────┬───────────┐ │ 3 6 10 1│ 7 16 4 15│12 11 13 2│ 8 9 5 14│ │ 7 2 15 12│ 1 11 14 5│ 6 3 8 9│13 16 4 10│ │ 9 14 13 11│ 2 8 10 3│ 4 16 5 1│15 6 7 12│ │ 8 5 4 16│12 6 9 13│14 10 15 7│ 3 11 1 2│ ├───────────┼───────────┼───────────┼───────────┤ │13 16 9 8│11 7 12 1│15 14 3 10│ 6 4 2 5│ │14 11 6 3│ 4 13 2 16│ 5 1 9 12│ 7 15 10 8│ │ 1 12 2 5│15 10 3 9│ 7 8 6 4│11 13 14 16│ │10 15 7 4│ 5 14 6 8│13 2 16 11│ 9 12 3 1│ ├───────────┼───────────┼───────────┼───────────┤ │12 1 16 7│10 3 15 6│ 9 4 14 8│ 5 2 13 11│ │ 6 4 11 15│13 2 8 12│16 5 10 3│ 1 14 9 7│ │ 2 13 3 9│16 5 1 14│11 12 7 6│10 8 15 4│ │ 5 10 8 14│ 9 4 7 11│ 1 13 2 15│16 3 12 6│ ├───────────┼───────────┼───────────┼───────────┤ │ 4 9 5 10│ 3 12 16 7│ 2 6 11 13│14 1 8 15│ │16 7 12 13│14 9 11 2│ 8 15 1 5│ 4 10 6 3│ │11 3 1 6│ 8 15 13 4│10 7 12 14│ 2 5 16 9│ │15 8 14 2│ 6 1 5 10│ 3 9 4 16│12 7 11 13│ └───────────┴───────────┴───────────┴───────────┘ s34←0 12⍴0 ⍝ sample 3×4 problem s34⍪←9 6 0 0 10 0 0 8 2 0 0 4 s34⍪←0 1 0 11 0 12 0 0 0 0 3 5 s34⍪←0 0 0 0 6 0 7 11 12 0 0 0 s34⍪←0 0 10 7 0 0 0 0 4 0 9 0 s34⍪←1 0 6 0 12 11 0 4 0 3 0 0 s34⍪←0 0 9 0 0 10 8 1 0 0 6 0 s34⍪←0 7 0 0 11 2 1 0 0 12 0 0 s34⍪←2 0 12 0 4 0 6 5 0 1 0 11 s34⍪←0 10 0 5 0 0 0 0 3 4 0 0 s34⍪←0 0 0 10 5 8 0 7 0 0 0 0 s34⍪←5 3 0 0 0 0 11 0 9 0 0 0 s34⍪←7 0 0 0 3 0 0 6 0 0 4 2 ⍕3 4∘sbox¨3 4 sudoku s34 ⍝ display all solutions ┌───────────┬───────────┬───────────┐ ┌───────────┬───────────┬───────────┐ │ 9 6 5 12│10 1 3 8│ 2 7 11 4│ │ 9 6 5 12│10 1 3 8│ 2 7 11 4│ │ 8 1 7 11│ 9 12 4 2│ 6 10 3 5│ │ 8 1 7 11│ 9 12 4 2│ 6 10 3 5│ │10 4 2 3│ 6 5 7 11│12 9 1 8│ │10 4 2 3│ 6 5 7 11│12 9 1 8│ ├───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┤ │12 11 10 7│ 2 6 5 3│ 4 8 9 1│ │12 11 10 7│ 2 6 5 3│ 4 8 9 1│ │ 1 2 6 8│12 11 9 4│ 7 3 5 10│ │ 1 2 6 8│12 11 9 4│10 3 5 7│ │ 3 5 9 4│ 7 10 8 1│11 2 6 12│ │ 3 5 9 4│ 7 10 8 1│11 2 6 12│ ├───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┤ │ 4 7 3 6│11 2 1 10│ 5 12 8 9│ │ 4 7 3 6│11 2 1 10│ 5 12 8 9│ │ 2 8 12 9│ 4 3 6 5│10 1 7 11│ │ 2 8 12 9│ 4 3 6 5│ 7 1 10 11│ │11 10 1 5│ 8 7 12 9│ 3 4 2 6│ │11 10 1 5│ 8 7 12 9│ 3 4 2 6│ ├───────────┼───────────┼───────────┤ ├───────────┼───────────┼───────────┤ │ 6 9 4 10│ 5 8 2 7│ 1 11 12 3│ │ 6 9 4 10│ 5 8 2 7│ 1 11 12 3│ │ 5 3 8 2│ 1 4 11 12│ 9 6 10 7│ │ 5 3 8 2│ 1 4 11 12│ 9 6 7 10│ │ 7 12 11 1│ 3 9 10 6│ 8 5 4 2│ │ 7 12 11 1│ 3 9 10 6│ 8 5 4 2│ └───────────┴───────────┴───────────┘ └───────────┴───────────┴───────────┘ ⍝ Another coding (ADC): sudoku←{⎕IO←0 ⍝ Sudoku - ⍵: N×N setup where box size N*÷2 is integral ⍝ The setup is a valid arrangement in some cells of numbers from 1-N; the rest are 0´s. ⍝ Each row, column and the N boxes of each result must contain all numbers 1 to N. valid←{ ⍝ Validate. ⍵ be... (2≠⍴⍴⍵)∨(≠/2↑⍴⍵)∨0≠1|(⊃⍴⍵)*÷2:1 ⍝ a square matrix with an integral box size ((⍴⍵)⍴0)≢⊃1↑0⍴⊂⍵:1 ⍝ numeric N×N matrix 1∊~⍵∊⍳1+⊃⍴⍵:1 ⍝ numbers 0-N only 0=+/,⍵ ⍝ at least one number } box←{⍵⌿(⍵×⍳⍵)∘.+⍵/⍳⍵} ⍝ Box template ⍵:sq root of size chk←{1∊1<+⌿(1+⍳⊃⍴⍵)∘.=⍵} ⍝ Check for duplicates of 1-9 in ⍵ sets←{⍉⍺{(⍺=+⌿⍵)/⍵}(⍵⍴2)⊤⍳2*⍵} ⍝ LM sets of ⍺ unique nrs from 1 to ⍵ iv←{⍵/⍳⍴⍵} ⍝ idiom un←{(⍳⍴⍵)=⍵⍳⍵} ⍝ LV of first unique items in vector indx←{⍺[⍵]} ⍝ index ⍺ by ⍵ search←{ ⍝ Search possibilities for a cell r p←⍵ p←⍺ adjust p ⍝ adjust possibles for current cell ~0∊⊃(r p)←rules r p:r ⍝ resolve using logical tests (next p)∇¨⊂r p ⍝ search cell with minimum possibilities } adjust←{ ⍝ Adjust cell to single value 0>⊃⍺:⍵ ⍝ no cell p←⍵ ⋄ p[;⊃⍺]←⍺[1]=⍳⊃⍴⍵ ⋄ p ⍝ item ⍺ in to 1, rest of cell to 0 } next←{ ⍝ Cell-value pairs for possible values ⍵{⍵,¨iv ⍺[;⍵] ⍝ in the cell with the minimum nr of }{1⍳⍨⍺\{⍵=⌊/⍵}⍺/⍵}/{(⍵>1)⍵}+⌿⍵ ⍝ possibilities (2 or more) } rules←{ ⍝ Apply logic tests to resolve cells ~0∊⊃z←sole ⍵:z ⍝ detect single-value possibilities ~0∊⊃z←↑singles/(⍳⊃⍴RCB),⊂z:z ⍝ single-valued cells in row/col/box ~0∊⊃z←↑uniques/(⍳(⍴⊃z)*÷2),⊂z:z ⍝ values unique to one row/col of a box ~0∊⊃z←↑NinN/4 3 2,⊂z:z ⍝ detect N vals in N cells ~0∊⊃z←↑matches/4 3 2,⊂z:z ⍝ matches of N vals in N cells of r/c/b z≡⍵:⍵ ⍝ finish if no state change ∇ z ⍝ otherwise repeat rules } sole←{ ⍝ Resolve sole value cells. ⍺:soln, ⍵:possibles ~0∊⊃r p←⍵:⍵ ⍝ pass through 0∊n←+⌿p:⍬ ⍬ ⍝ no go (⍴r)=i←1⍳⍨n×r=0:⍵ ⍝ no remaining single value cells r[i]←1+p[;i]⍳1 ⍝ set result value p[¯1+i⊃r;i~⍨iv i⊃Masks]←0 ⍝ remove as possible value in related cells ∇ r p ⍝ check for further single-value cells } singles←{ ⍝ Fix box cells that resolve to single value ~0∊⊃r p←⍵:⍵ ⍝ pass through i←RCB[⍺;] ⍝ cells in row, col or box b←i/p ⍝ possibles for cells ~1∊l←(1=+/b)∧~(1+⍳⊃⍴p)∊i/r:⍵ ⍝ values that occur just once ex result values c←(iv i)[(↓l⌿b)⍳¨1] ⍝ cells where they occur p[;c]←(⍳⊃⍴p)∘.=iv l ⍝ modify to just the single value sole r p ⍝ resolve the sole values } uniques←{ ⍝ Unique to one row/col of the ⍺´th box ~0∊⊃r p←⍵:⍵ ⍝ pass through b←p[;⍺⊃Box] ⍝ box cell values i←(⍴i)⊤iv,(i>1)∧i=⍉(⌽⍴i)⍴+/i←+/b ⍝ 2 or more unique to a row j←(⍴j)⊤iv,(j>1)∧j=⍉(⌽⍴j)⍴+/j←+/[1]b ⍝ 2 or more unique to a column (0∊⍴i)∧0∊⍴j:⍵ ⍝ none found s←⊃⌽⍴b ⍝ box size p[(s(⍺ rinds)↓i),s(⍺ cinds)↓j]←0 ⍝ remove vals from cols of other boxes sole r p ⍝ resolve sole values } rinds←{ ⍝ uniques: row pick inds to update 0=⍴⊃⍵:0⍴⊂0 0 ↑,/(0⊃⍵),¨¨((⍺*2)×(1⊃⍵)+¨⍺×⌊⍺⍺÷⍺)+⊂(⍳⍺*2)~(⍺×⍺|⍺⍺)+⍳⍺ } cinds←{ ⍝ uniques: column pick inds to update 0=⍴⊃⍵:0⍴⊂0 0 ↑,/(0⊃⍵),¨¨((1⊃⍵)+¨⍺×⍺|⍺⍺)+⊂(⍺*2)×(⍳⍺*2)~(⍺×⌊⍺⍺÷⍺)+⍳⍺ } matches←{ ⍝ Resolve exact matches on ⍺ possible values ~0∊⊃r p←⍵:⍵ ⍝ pass through 0∊n←+⌿p:⍬ ⍬ ⍝ no go if no possibilities for a cell i←(n=⍺){iv ⍺\un 2⊥⍺/⍵}p ⍝ cells with ⍺ possible values sole↑(⍺ match)/i,⊂⍵ ⍝ resolve each ⍺-set then sole values } match←{ ⍝ Resolve exact matches in row/col/box ~0∊⊃r p←⍵:⍵ ⍝ pass through ⍺⍺≠+/p[;⍺]:⍵ ⍝ cell no longer has ⍺⍺ values ⍺⍺>+/l←p[;⍺]∧.=p:⍵ ⍝ occurrences of matches with the ⍺´th cell 1∊⍺⍺<n←+/l/RCB:⍬ ⍬ ⍝ no go if >⍺⍺ matches in any row/col/box ~1∊n=⍺⍺:⍵ ⍝ no r/c/b´s with exactly ⍺⍺ matches p←↑(l do_matches)/(iv n=⍺⍺),⊂p ⍝ remove matched vals from related cells sole r p ⍝ resolve singles then sole values } do_matches←{ ⍝ Remove vals from other row/col/box cells p←⍵ ⍝ ⍺⍺ marks all occurrences of match p[iv p[;⍺⍺⍳1];iv RCB[⍺;]∧~⍺⍺]←0 ⍝ filter occurrences in the ⍺´th row/col/box p } NinN←{ ⍝ Reduce ⍺-sets in exactly ⍺ cells of a row/col/box ~0∊⊃r p←⍵:⍵ ⍝ pass through s←⍺ sets(⍴r)*÷2 ⍝ all combns of sets of ⍺ values l←r=0 ⍝ non-singular cells n←(⍺=(s∨.∧p)+.∧⍉RCB)∧⍺=(s∨.∧l\l/p)+.∧⍉RCB ⍝ set-RCB combinations with ⍺ occurrences i←↓[0](⍴n)⊤iv,n ⍝ indices of set-RCB combns sole↑(s do_NinN)/i,⊂⍵ ⍝ reduce non-set values from cells then sole values } do_NinN←{ ⍝ Remove values not in set ⊃⍺ from identified cells i←⍺⍺[0⊃⍺;] ⋄ j←RCB[1⊃⍺;] ⍝ set values / row-col-box mask r p←⍵ ⋄ p[iv~i;iv j∧i∨.∧p]←0 ⋄ r p ⍝ [vals not in set;cells in set and in row/col/box] } setup←{ ⍝ Setup LM possibilities per cell p←(⊂1+⍳⊃⍴⍵)~¨Masks/¨⊂,⍵ ⍝ possibles per cell, except... ((0≠,⍵)/p)←0~⍨,⍵ ⍝ adjust given cells to single value (1+⍳⊃⍴⍵)∘.∊p ⍝ convert to LM vals×cells } res←(⍴⍵)∘{⍺∘⍴¨((⍴⍵)⍴(×/⍺)↑1)⊂⍵} ⍝ Shape result(s) valid ⍵:'Invalid setup' ⍝ Validate RCB←{,¨(⍵/⍳⍵)(⍵ ⍵⍴⍳⍵)(box ⍵*÷2)}⊃⍴⍵ ⍝ Rows-Columns-Boxes Masks←↓↑∨/{⍵∘.=⍵}¨RCB ⍝ Sets per cell of related row/col/box cells RCB←↑⍪/(⊂⍳⊃⍴⍵)∘.=¨RCB ⍝ Selection vectors for rows,columns,boxes Box←((⍴⍵)*÷2)∘⍴¨(↓RCB[(2×⊃⍴⍵)+⍳⊃⍴⍵;])/¨⊂⍳×/⍴⍵ ⍝ Box indices 1∊chk¨Masks/¨⊂,⍵:'Invalid setup' ⍝ Duplicates in row/column/box res∊¯1 0 search(,⍵)(setup ⍵) ⍝: ADC 5Jun2005 } ⍕sbox¨sudoku s33 ⍝ display all solutions ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ │2 8 1│6 9 3│5 7 4│ │2 8 1│6 9 3│5 7 4│ │3 8 1│6 9 4│5 7 2│ │4 6 9│2 7 5│3 8 1│ │4 6 9│2 7 5│3 8 1│ │4 6 9│2 7 5│3 8 1│ │3 7 5│8 1 4│2 9 6│ │5 7 3│8 1 4│2 9 6│ │2 7 5│8 1 3│4 9 6│ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ │7 9 2│5 6 1│4 3 8│ │7 9 2│5 6 1│4 3 8│ │7 9 4│5 6 2│1 3 8│ │6 5 8│4 3 9│1 2 7│ │6 5 8│4 3 9│1 2 7│ │6 5 8│4 3 1│9 2 7│ │1 3 4│7 8 2│6 5 9│ │1 3 4│7 8 2│6 5 9│ │1 3 2│7 8 9│6 5 4│ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ │5 4 6│9 2 7│8 1 3│ │3 4 6│9 2 7│8 1 5│ │5 4 6│9 2 7│8 1 3│ │9 2 3│1 4 8│7 6 5│ │9 2 5│1 4 8│7 6 3│ │9 2 3│1 4 8│7 6 5│ │8 1 7│3 5 6│9 4 2│ │8 1 7│3 5 6│9 4 2│ │8 1 7│3 5 6│2 4 9│ └─────┴─────┴─────┘ └─────┴─────┴─────┘ └─────┴─────┴─────┘ ⍝ Phil's translation of Arthur's K code: sudoku←{⎕io←0 ⍝ Whitney/Last p←{(↑⍵)∘{(⍺∨.=⍵)/⍳n×n}¨,⍵},(n*÷2){⍵,⍺⊥⌊⍵÷⍺}¨⍳n n←⍴⍵ m←{(⊂⍵)⌈(⊂⍺=⍳⍴⍵)×(1+⍳n)~⍵[⍺⊃p]} (⍴⍵)∘⍴¨⊃{⊃,/⍺ m¨⍵}/{( ⍸⍵=0),⊂⊂⍵},⍵ } ⍕sbox¨sudoku s33 ⍝ display all solutions ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ │2 8 1│6 9 3│5 7 4│ │2 8 1│6 9 3│5 7 4│ │3 8 1│6 9 4│5 7 2│ │4 6 9│2 7 5│3 8 1│ │4 6 9│2 7 5│3 8 1│ │4 6 9│2 7 5│3 8 1│ │5 7 3│8 1 4│2 9 6│ │3 7 5│8 1 4│2 9 6│ │2 7 5│8 1 3│4 9 6│ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ │7 9 2│5 6 1│4 3 8│ │7 9 2│5 6 1│4 3 8│ │7 9 4│5 6 2│1 3 8│ │6 5 8│4 3 9│1 2 7│ │6 5 8│4 3 9│1 2 7│ │6 5 8│4 3 1│9 2 7│ │1 3 4│7 8 2│6 5 9│ │1 3 4│7 8 2│6 5 9│ │1 3 2│7 8 9│6 5 4│ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ │3 4 6│9 2 7│8 1 5│ │5 4 6│9 2 7│8 1 3│ │5 4 6│9 2 7│8 1 3│ │9 2 5│1 4 8│7 6 3│ │9 2 3│1 4 8│7 6 5│ │9 2 3│1 4 8│7 6 5│ │8 1 7│3 5 6│9 4 2│ │8 1 7│3 5 6│9 4 2│ │8 1 7│3 5 6│2 4 9│ └─────┴─────┴─────┘ └─────┴─────┴─────┘ └─────┴─────┴─────┘ ⍝ Morten's coding: sudoku←{⎕io←0 rcq←(↑,⍳9 9),3/,3⌿3 3⍴⍳9 ⍝ Row, Column, Quadrant p←{⍸rcq∨.=⍵}¨↓rcq ⍝ Cells in same row, col or quadrant nzd←1+⍳9 ⍝ Non-zero digits to gain a little more speed ⊃{⊃,/⍺{(nzd~⍵[⍺⊃p])⊣@⍺¨⊂⍵}¨⍵}/(⍸⍵=0),⊂⊂⍵ ⍝ kapow! } ⍕sbox∘(9 9∘⍴)¨ sudoku ,s33 ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ │2 8 1│6 9 3│5 7 4│ │2 8 1│6 9 3│5 7 4│ │3 8 1│6 9 4│5 7 2│ │4 6 9│2 7 5│3 8 1│ │4 6 9│2 7 5│3 8 1│ │4 6 9│2 7 5│3 8 1│ │5 7 3│8 1 4│2 9 6│ │3 7 5│8 1 4│2 9 6│ │2 7 5│8 1 3│4 9 6│ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ │7 9 2│5 6 1│4 3 8│ │7 9 2│5 6 1│4 3 8│ │7 9 4│5 6 2│1 3 8│ │6 5 8│4 3 9│1 2 7│ │6 5 8│4 3 9│1 2 7│ │6 5 8│4 3 1│9 2 7│ │1 3 4│7 8 2│6 5 9│ │1 3 4│7 8 2│6 5 9│ │1 3 2│7 8 9│6 5 4│ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ ├─────┼─────┼─────┤ │3 4 6│9 2 7│8 1 5│ │5 4 6│9 2 7│8 1 3│ │5 4 6│9 2 7│8 1 3│ │9 2 5│1 4 8│7 6 3│ │9 2 3│1 4 8│7 6 5│ │9 2 3│1 4 8│7 6 5│ │8 1 7│3 5 6│9 4 2│ │8 1 7│3 5 6│9 4 2│ │8 1 7│3 5 6│2 4 9│ └─────┴─────┴─────┘ └─────┴─────┴─────┘ └─────┴─────┴─────┘ ⍝ Roger's revamp: sudoku←{⍺←(⍴⍵)*÷2 ⍝ Solutions of shape-⍺ Sudoku puzzle ⍵. svec ← {⊃pvex/(⍸⍵=0),⊂⊂⍵} ⍝ solution vector pvex ← {⊃,/⍺∘pvec¨⍵} ⍝ vector of placements pvec ← {(⍺ avl ⍵)⊣@(⊂⍺)¨⊂⍵} ⍝ placements avl ← {(⍳⊃⍴⍵)~⍵×⊃⍺⌷CMAP} ⍝ list of available numbers at ← {⍵+⍺×(⍳⍴⍵)∊⊂⍺⍺} ⍝ ⍺ at cell ⍺⍺ in ⍵ rcb ← {(⍳⍴⍵),¨⍺ box(⍴⍵)÷⍺} ⍝ row/column/box numbers box ← {(⊃⍺)⌿(⊃⌽⍺)/⍵⍴⍳×/⍵} ⍝ box numbers for a puzzle of size ⍵*2 cmap ← {⊂[⍳2]1∊¨⍵∘.=⍵} ⍝ contention map for puzzle ⍵ CMAP ← cmap ⍺ rcb ⍵ ⍝ contention map for puzzle svec ⍵ ⍝ vector of solutions. } ⍕sbox¨sudoku s22 ┌───┬───┐ ┌───┬───┐ ┌───┬───┐ │1 2│3 4│ │1 2│3 4│ │1 2│3 4│ │3 4│1 2│ │3 4│2 1│ │3 4│1 2│ ├───┼───┤ ├───┼───┤ ├───┼───┤ │2 1│4 3│ │2 1│4 3│ │2 3│4 1│ │4 3│2 1│ │4 3│1 2│ │4 1│2 3│ └───┴───┘ └───┴───┘ └───┴───┘ ⍝∇ sudoku Back to: code Back to: Workspaces