function isValidSudoku(board) {
const grid = 3;
const [isRowValid, isColumnValid, isSubGridValid] = [
rowCheck(board),
columnCheck(board),
subGrid(board, grid),
];
const isSudoku = [isRowValid, isColumnValid, isSubGridValid].every(
(elem) => elem === grid ** 2
);
return isSudoku;
}
function generateUniqueValues(arr) {
let nums = arr.join("").match(/\d/g);
const duplicate = [...new Set(nums)];
!nums ? (nums = 0) : (nums = nums.length);
const compareDuplicateLength = nums === duplicate.length;
return compareDuplicateLength;
}
function rowCheck(board) {
let isRowValid = 0;
for (let i = 0; i < board.length; i++) {
const compareDuplicateLength = generateUniqueValues(board[i]);
compareDuplicateLength ? isRowValid++ : (isRowValid += 0);
}
return isRowValid;
}
function columnCheck(board) {
let isColumnValid = 0;
for (let i = 0; i < board.length; i++) {
let [column] = [[]];
for (let j = 0; j < board.length; j++) column.push(board[j][i]);
const compareDuplicateLength = generateUniqueValues(column);
compareDuplicateLength ? isColumnValid++ : (isColumnValid += 0);
column = [];
}
return isColumnValid;
}
function subGrid(board, grid) {
const [finalGrid, subGrid] = [[], []];
for (let i = 0; i < board.length / grid; i++) {
let grids = board.slice(i * 3, i * grid + grid);
subGrid.push(grids);
}
for (let j = 0; j < subGrid.length; j++) {
let innerGrid = [];
for (let m = 0; m < subGrid[j].length; m++) {
let i = 0;
while (i < grid) {
const currentBoard = subGrid[j][i].slice(m * grid, m * grid + grid);
innerGrid.push(currentBoard);
i++;
}
finalGrid.push(innerGrid);
innerGrid = [];
i = 0;
}
}
let isSubGridValid = 0;
for (let k = 0; k < finalGrid.length; k++) {
const innerGrid = finalGrid[k];
const mergeSubGrid = innerGrid.flat();
const isDuplicateInSubGrid = generateUniqueValues(mergeSubGrid);
if (!isDuplicateInSubGrid) break;
const [isGridRowValid, isGridColumnValid] = [
rowCheck(innerGrid),
columnCheck(innerGrid),
];
isGridRowValid === 3 && isGridColumnValid === 3
? isSubGridValid++
: (isSubGridValid += 0);
}
console.log("Final Grid ", isSubGridValid);
return isSubGridValid;
console.log("Is row valid ", isRowValid)
console.log("Is column valid ", isColumnValid)
}
const sudokuBoardT = [
["1", "2", ".", ".", "3", ".", ".", ".", "."],
["4", ".", ".", "5", ".", ".", ".", ".", "."],
[".", "9", "8", ".", ".", ".", ".", ".", "3"],
["5", ".", ".", ".", "6", ".", ".", ".", "4"],
[".", ".", ".", "8", ".", "3", ".", ".", "5"],
["7", ".", ".", ".", "2", ".", ".", ".", "6"],
[".", ".", ".", ".", ".", ".", "2", ".", "."],
[".", ".", ".", "4", "1", "9", ".", ".", "8"],
[".", ".", ".", ".", "8", ".", ".", "7", "9"],
];
const sudokuBoardF = [
["1", "2", ".", ".", "3", ".", ".", ".", "."],
["4", ".", ".", "5", ".", ".", ".", ".", "."],
[".", "9", "1", ".", ".", ".", ".", ".", "3"],
["5", ".", ".", ".", "6", ".", ".", ".", "4"],
[".", ".", ".", "8", ".", "3", ".", ".", "5"],
["7", ".", ".", ".", "2", ".", ".", ".", "6"],
[".", ".", ".", ".", ".", ".", "2", ".", "."],
[".", ".", ".", "4", "1", "9", ".", ".", "8"],
[".", ".", ".", ".", "8", ".", ".", "7", "9"],
];
const sudokuResult = isValidSudoku(sudokuBoardF);
console.log("Is Sudoku ", sudokuResult);