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 }