⍝ Knuth's Algorithm X:
M←⍉⍪ 1 0 0 1 0 0 1 ⍝ http://en.wikipedia.org/wiki/Algorithm_X
M ⍪← 1 0 0 1 0 0 0
M ⍪← 0 0 0 1 1 0 1
M ⍪← 0 0 1 0 1 1 0
M ⍪← 0 1 1 0 0 1 1
M ⍪← 0 1 0 0 0 0 1
X M ⍝ Rows that form exact cover.
0 1 0 1 0 1
(X M)⌿M ⍝ covering rows
1 0 0 1 0 0 0
0 0 1 0 1 1 0
0 1 0 0 0 0 1
1∧.=+⌿(X M)⌿M ⍝ condition for exact cover.
1
M←⍉⍪ 0 0 1 0 1 1 0
M ⍪← 1 0 0 1 0 0 1
M ⍪← 0 1 1 0 0 1 0
M ⍪← 1 0 0 1 0 0 0
M ⍪← 0 1 0 0 0 0 1
M ⍪← 0 0 0 1 1 0 1
X M
1 0 0 1 1 0
(X M)⌿M ⍝ exact cover
0 0 1 0 1 1 0
1 0 0 1 0 0 0
0 1 0 0 0 0 1
1∧.=+⌿(X M)⌿M ⍝ condition for exact cover.
1
1 disp X¨((⍳2 2)-⍳1)⍴¨1 ⍝ edge cases.
┌→┬─┐
↓0│0│
├⊖┼⊖┤
│0│1│
└→┴→┘
X 3 4↑=/¨⍳3 3 ⍝ too wide: uncovered columns.
0
X 4 3↑=/¨⍳3 3 ⍝ too tall: not all rows needed.
1 1 1 0
X=/¨⍳3 3 ⍝ identity: just right.
1 1 1
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Exact cover Sudoku solver:
smat←{ ⍝ Matrix for ⍵ ⍵-Sudoku puzzle.
z←,[⍳6],[6+⍳4]⍳10⍴⍵*÷2 ⍝ cell coordinate properties.
row←↓1 1 0 0 1 1 1 1 1 1/↑z ⍝ each row must contain each number.
col←↓0 0 1 1 1 1 1 1 1 1/↑z ⍝ .. col .. .. .. .. .. ..
box←↓1 0 1 0 1 1 1 1 1 1/↑z ⍝ .. box .. .. .. .. .. ..
all←↓1 1 1 1 0 0 1 1 1 1/↑z ⍝ each cell must contain a number.
same←≡/∘(1 0 0 0 1 0 0 0∘⊂) ⍝ matching pairs.
same¨row,col,box,all ⍝ constraints matrix for ⍵ ⍵-puzzle.
}
sudokuX←{⎕IO←1 ⍝ Exact cover Sudoku solver.
n n←⍴⍵ ⍝ n×n puzzle.
⍺←smat n ⍝ generic ⍵×⍵ constraint matrix.
r←∊(⍵≠0)>(⊂⍳n)∊¨⍵ ⍝ already placed rows.
m←(~r)⌿⍺ ⍝ reduced matrix.
f←X m ⍝ exact cover.
z←(~r)\f ⍝ merge of placements.
n n⍴z/(⍴z)⍴⍳n ⍝ solution matrix.
}
s44 ← 4 4⍴ 0 0 0 0, 0 0 2 1, 3 0 0 4, 0 0 0 0
s44 ⍝ puzzle.
0 0 0 0
0 0 2 1
3 0 0 4
0 0 0 0
sudokuX s44 ⍝ solution.
2 1 4 3
4 3 2 1
3 2 1 4
1 4 3 2
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ Exact cover N-Queens:
queensX←{ ⍝ Exact cover N-Queens.
m←⍳3/⍵ ⍝ cell coordinate properties.
r←=/¨1 0 1∘/¨m ⍝ each rank must contain one queen.
f←=/¨0 1 1∘/¨m ⍝ .. file .. .. ..
dm←-/¨⍳2/⍵ ⍝ diagonals.
du←{⍵[⍋⍵]}∪,dm ⍝ unique diagnonals.
x←dm∘.=du ⍝ left diagonals.
y←(⊖dm)∘.=du ⍝ right diagonals.
m←,[⍳2]x,y,r,f ⍝ constraints matrix.
d←~(⍳1↓⍴m)∊⍳2×⍴du ⍝ mask of required cols.
⍵ ⍵⍴d X m ⍝ exact cover - matrix of queens.
}
queensX¨ 0 to 8
┌┬─┬───┬─────┬───────┬─────────┬───────────┬─────────────┬───────────────┐
││1│0 0│0 0 0│0 1 0 0│0 0 0 0 1│0 0 0 0 1 0│0 0 0 0 0 0 1│0 0 0 0 0 0 0 1│
││ │0 0│0 0 0│0 0 0 1│0 1 0 0 0│0 0 1 0 0 0│0 0 0 0 1 0 0│0 0 0 1 0 0 0 0│
││ │ │0 0 0│1 0 0 0│0 0 0 1 0│1 0 0 0 0 0│0 0 1 0 0 0 0│1 0 0 0 0 0 0 0│
││ │ │ │0 0 1 0│1 0 0 0 0│0 0 0 0 0 1│1 0 0 0 0 0 0│0 0 1 0 0 0 0 0│
││ │ │ │ │0 0 1 0 0│0 0 0 1 0 0│0 0 0 0 0 1 0│0 0 0 0 0 1 0 0│
││ │ │ │ │ │0 1 0 0 0 0│0 0 0 1 0 0 0│0 1 0 0 0 0 0 0│
││ │ │ │ │ │ │0 1 0 0 0 0 0│0 0 0 0 0 0 1 0│
││ │ │ │ │ │ │ │0 0 0 0 1 0 0 0│
└┴─┴───┴─────┴───────┴─────────┴───────────┴─────────────┴───────────────┘
Alpha ##.test'pentominos' ⍝ pentomino-tiling tutorial
PX←{⍵{⍉(⍵⍴2)⊤{⍵/⍳⍴⍵}1∧.=(⍉⍺)+.∧(⍵⍴2)⊤⍳2*⍵}⍬⍴⍴⍵} ⍝ Phil's coding
1∧.=+⌿(,PX M)⌿M ⍝ condition for exact cover.
1
⍝∇ X
Back to: code
Back to: Workspaces