window.onload = setup
var cells_ordered = null
function setup() {
let table = document.getElementById('sudoku_board')
cells_ordered = table.getElementsByTagName('td')
console.log(cells_ordered.length)
for (let c = 0; c < 81; c++){
let cell = cells_ordered[c]
cell.addEventListener("keypress",check_cell_content)
cell.setAttribute("contenteditable","")
cell.innerHTML = '
' //Moves caret position to vertical center
}
show_all_solutions()
}
function fill_default() {
$('#message').text('')
publish_board([
[9,NaN,5,NaN,NaN,NaN,3,NaN,NaN],
[NaN,6,NaN,NaN,NaN,1,NaN,5,NaN],
[3,2,1,9,NaN,NaN,NaN,NaN,NaN],
[NaN,9,2,5,NaN,NaN,4,1,3],
[NaN,5,7,4,NaN,NaN,NaN,NaN,NaN],
[NaN,1,NaN,NaN,NaN,2,NaN,NaN,5],
[NaN,7,NaN,NaN,NaN,9,1,NaN,6],
[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN],
[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
])
}
function clear_board() {
$('#message').text('')
for (let row = 0; row < 9; row++)
for (let column = 0; column < 9; column++)
publish_cell(row, column, NaN)
}
function check_cell_content(e) {
console.log(e.key)
let content = parseInt(e.key)
console.log(content)
if ((content <= 0) || isNaN(content) || e.target.innerText.trim().length > 0){
e.preventDefault()
}
}
function get_data() {
let table = document.getElementById('sudoku_board')
let cells_ordered = table.getElementsByTagName('td')
let sudoku_board = [[],[],[],[],[],[],[],[],[]]
for (let cell = 0;cell<81;cell++){
let column = cell%9
let row = Math.floor(cell/9)
let value = parseInt(cells_ordered[cell].textContent.trim())
sudoku_board[row][column] = value
}
return sudoku_board
}
function publish_cell(row, column, value) {
cells_ordered[row*9 + column].innerHTML = "" + (isNaN(value) ? "
" : value)
}
function publish_board(board) {
for (let row = 0; row < 9; row++)
for (let column = 0; column < 9; column++)
publish_cell(row, column, board[row][column])
}
function set_cell(board, row, column, value) {
board[row][column] = value
publish_cell(row, column, value)
}
function solve_step(board, cell) {
let column = cell%9
let row = Math.floor(cell/9)
if(cell > 80)
return true
if(!isNaN(board[row][column]))
return solve_step(board, cell + 1)
for(let nr = 1;nr<=9;nr++) {
if(check_cell(board, row, column, nr)) {
set_cell(board, row, column, nr)
if(solve_step(board, cell + 1)) {
return true;
} else {
set_cell(board, row, column, NaN)
}
}
}
return false
}
function board_to_string(board) {
let ret = ""
for (let row = 0; row < 9; row++)
for (let column = 0; column < 9; column++)
ret += isNaN(board[row][column]) ? "0" : "" + board[row][column]
return ret
}
function store_board(board) {
$.ajax({
url: '/solution',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({ "Data": board_to_string(board) }),
success: function () {
$('#message').text('Stored solution to database')
show_all_solutions()
},
error: function () {
$('#message').text('Error on saving the solution to the database.')
}
})
}
function solve() {
$('#message').text('')
let board = get_data()
if (!check_board(board)) {
$('#message').text("The numbers on the board are in conflict with the rules of Sudoku")
return
}
if (!solve_step(board, 0)) {
$('#message').text("Unable to solve this Sudoku")
return
}
store_board(board)
}
function show_all_solutions() {
jQuery.get("/solution", function (data) {
new DevExpress.ui.dxDataGrid(document.getElementById("allsolutions"), {
dataSource: data,
columnAutoWidth: true
});
}).fail(function (e) { console.warn("fetching solution failed: ", e) })
}
function check_cell(board, row, col, value) {
// if already present on the column, not acceptable
for (let r = 0; r < 9; ++r)
if (board[r][ col] == value) return false;
// if already present on the row, not acceptable
for (let c = 0; c < 9; ++c)
if (board[row][ c] == value) return false;
// if already present in the same 3x3 square, also not acceptable
let r1 = Math.floor(row / 3) * 3;
let c1 = Math.floor(col / 3) * 3;
for (let r = r1; r < r1 + 3; ++r) {
for (let c = c1; c < c1 + 3; ++c) {
if (board[r][c] == value) return false;
}
}
return true;
}
function check_board(board) {
for (let r = 0; r < 9; ++r)
for (let c = 0; c < 9; ++c) {
let value = board[r][c]
if(isNaN(value))
continue
board[r][c] = NaN
let res = check_cell(board,r,c, value)
board[r][c] = value
if(!res)
return false
}
return true
}