Sudoku: Difference between revisions

Content added Content deleted
m (minor style/formatting)
(→‎{{header|D}}: add implementation)
Line 157: Line 157:
(7 5 9 2 3 8 1 4 6)
(7 5 9 2 3 8 1 4 6)
(8 2 6 4 1 9 7 3 5))</pre>
(8 2 6 4 1 9 7 3 5))</pre>

=={{header|D}}==
<lang d>
import std.stdio;

bool[char]genFull() {
return ['1':true,
'2':true,
'3':true,
'4':true,
'5':true,
'6':true,
'7':true,
'8':true,
'9':true];
}
// these three functions assume that the number has not already been found
bool[char]availRow(int x,int y,bool[char]available=genFull()) {
// x designates row, y designates column
foreach(ele;puzzle[x]) {
if (ele != '_') available.remove(ele);
}
return available;
}

bool[char]availCol(int x,int y,bool[char]available=genFull()) {
// x designates row, y designates column
for(int i = 0;i<9;i++) {
if (puzzle[i][y] != '_') available.remove(puzzle[i][y]);
}
return available;
}

bool[char]availBox(int x,int y,bool[char]available=genFull()) {
// x designates row, y designates column
// get a base index for the boxes
int bx = x/3;bx*=3;
int by = y/3;by*=3;
for(int i = 0;i<3;i++) for(int j = 0;j<3;j++) {
if (puzzle[bx+i][by+j] != '_') available.remove(puzzle[bx+i][by+j]);
}
return available;
}

char[][]puzzle;
void main() {
puzzle ~= "394__267_".dup;
puzzle ~= "___3__4__".dup;
puzzle ~= "5__69__2_".dup;
puzzle ~= "_45___9__".dup;
puzzle ~= "6_______7".dup;
puzzle ~= "__7___58_".dup;
puzzle ~= "_1__67__8".dup;
puzzle ~= "__9__8___".dup;
puzzle ~= "_264__735".dup;
while(1) {
bool done = true;
foreach(i,row;puzzle) foreach(j,ref ele;row) if (ele == '_') {
// poke at the elements that are _
auto remaining = availBox(i,j,availRow(i,j,availCol(i,j)));
if (remaining.keys.length == 1) ele = remaining.keys[0];
else done = false;
}
if (done) break;
}
// write out completed puzzle
writefln("Completed puzzle:");
foreach(row;puzzle) writefln("%s",row);
}
</lang>


=={{header|J}}==
=={{header|J}}==