Skip to content

Instantly share code, notes, and snippets.

@fffergal
Created August 10, 2010 10:38
Show Gist options
  • Save fffergal/517064 to your computer and use it in GitHub Desktop.
Save fffergal/517064 to your computer and use it in GitHub Desktop.
javascript:(function() {
document.write('
<!DOCTYPE html>
<html>
<head>
<title>Soduko solver</title>
<style type="text/css">
table {
cell-spacing: collapse;
}
td {
border: 1px solid black;
}
</style>
</head>
<body>
</body>
</html>');
var validate = function(string) {
try {
if (string.length != 81) throw 'isn\'t the right length';
if (!/^[0-9]+$/.test(string)) throw 'doesn\'t contain just numbers';
}
catch(error) {
alert('Sorry, that soduko ' + error + '.');
return false;
}
return true;
};
var rows2HTML = function(rows) {
var table = '<table><tbody>';
for (var i = 0; i < rows.length; i++) {
table += '<tr><td>' + rows[i].join('</td><td>') + '</td></tr>';
}
table += '</tbody></table>';
return table;
};
var preString = prompt('Enter the numbers of the soduko from left to right with 0s for the blanks', '060020000049010020010304000600000001002945800400000003000408070020030950000070030');
if (validate(preString)) {
var failed = false;
var rows = [];
var numbers = preString.split('');
for (var i = 0; i < 9; i++) {
rows[i] = [];
for (var j = 0; j < 9; j++) {
rows[i][j] = parseInt(numbers.shift());
}
}
var filledCounter = 0;
var currentI = 0;
var currentJ = 0;
var blanks = [];
var solverTimeout = function() {
console.log('new thread');
filledCounter = 0;
for (var i = currentI; i < 9; i++) {
if (!blanks[i]) blanks[i] = [];
for (var j = currentJ; j < 9; j++) {
currentJ = 0;
if (rows[i][j] == 0 || blanks[i][j]) {
blanks[i][j] = 1;
if (rows[i][j] != 9)
for (var k = rows[i][j] != 0 ? rows[i][j] + 1 : 1; k <= 9; k++) {
rows[i][j] = 0;
if (rows[i].indexOf(k) != -1) continue;
var goNext = false;
for (var l = 0; l < 9; l++) {
if (rows[l][j] == k) {
goNext = true;
break;
}
}
if (goNext) continue;
var squareRow = Math.floor(i / 3) * 3;
var squareCol = Math.floor(j / 3) * 3;
for (var l = 0; l < 3; l++) {
for (var m = 0; m < 3; m++) {
if (rows[squareRow + l][squareCol + m] == k) {
goNext = true;
}
if (goNext) break;
}
if (goNext) break;
}
if (goNext) continue;
console.log('filled ' + i + ',' + j + ' ' + k);
rows[i][j] = k;
filledCounter++;
if (filledCounter >= 30) {
currentI = j == 8 ? i + 1 : i;
currentJ = j == 8 ? 0 : j + 1;
setTimeout(solverTimeout, 0);
return;
}
break;
}
else rows[i][j] = 0;
if (rows[i][j] == 0) {
console.log('backtracking ' + i + ',' + j + ' ');
var oldI = i;
var oldJ = j;
var l = j == 0 ? i - 1 : i;
var m = j == 0 ? 8 : j - 1;
var goBreak = false;
while (l >= 0) {
if (m < 0) m = 8;
while (m >= 0) {
if (blanks[l][m]) {
i = m == 0 ? l - 1 : l;
j = m == 0 ? 8 : m - 1;
goBreak = true;
}
else {
m--;
}
if (goBreak) break;
}
if (goBreak) break;
l--;
}
if (oldI == i && oldJ == j) {
console.log('failed');
var failed = true;
}
}
}
if (failed) break;
}
if (failed) break;
}
if (!failed) {
console.log('done');
document.body.innerHTML += '<br>' + rows2HTML(rows);
}
}; /* solverTimeout */
setTimeout(solverTimeout, 0);
}
document.body.innerHTML = rows2HTML(rows);
console.log('OK');
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment