Created
August 10, 2010 10:38
-
-
Save fffergal/517064 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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