Skip to content

Instantly share code, notes, and snippets.

@auchenberg
Last active December 20, 2015 07:49
Show Gist options
  • Select an option

  • Save auchenberg/6096408 to your computer and use it in GitHub Desktop.

Select an option

Save auchenberg/6096408 to your computer and use it in GitHub Desktop.
SudokuBoardValidator
// Problem: http://www.eecis.udel.edu/~breech/contest.inet.fall.07/problems/valid-sudoku.html
function SudokuBoardValidator(data) {
this.data = data;
}
SudokuBoardValidator.prototype = {
isUniq: function (range) {
var index = [];
for (var i = 0; i < range.length; i++) {
var val = range[i];
if (index[val]) {
return false;
}
index[val] = true;
}
return true;
},
isWithinRange: function (range) {
for (var i = 0; i < range.length; i++) {
var val = range[i];
if (val < 1 || val > 9) {
return false;
}
}
return true;
},
isValidRange: function (range) {
return this.isUniq(range) && this.isWithinRange(range);
},
isRowsValid: function () {
for (var r = 0; r < this.data.length; r++) {
var row = this.data[r];
if (!this.isValidRange(row)) {
return false;
}
}
return true;
},
isColumnsValid: function () {
for (var r = 0; r < this.data.length; r++) {
var colRange = [];
for (var c = 0; c < 9; c++) {
var val = this.data[c][r];
colRange.push(val);
}
if (!this.isValidRange(colRange)) {
return false;
}
}
return true;
},
getCube: function (col, row) {
var cubeRange = [];
var cMax = col + 3;
var rMax = row + 3;
for (var c = col; c < cMax; c++) {
for (var r = row; r < rMax; r++) {
cubeRange.push(this.data[c][r]);
}
}
return cubeRange;
},
isCubesValid: function () {
for (var r = 0; r < 9; r += 3) {
for (var c = 0; c < 9; c += 3) {
var range = this.getCube(c, r);
if (!this.isValidRange(range)) {
return false;
}
}
}
return true;
},
check: function () {
return this.isRowsValid() && this.isColumnsValid() && this.isCubesValid();
}
}
var validData = [
[8, 3, 5, 4, 1, 6, 9, 2, 7],
[2, 9, 6, 8, 5, 7, 4, 3, 1],
[4, 1, 7, 2, 9, 3, 6, 5, 8],
[5, 6, 9, 1, 3, 4, 7, 8, 2],
[1, 2, 3, 6, 7, 8, 5, 4, 9],
[7, 4, 8, 5, 2, 9, 1, 6, 3],
[6, 5, 2, 7, 8, 1, 3, 9, 4],
[9, 8, 1, 3, 4, 5, 2, 7, 6],
[3, 7, 4, 9, 6, 2, 8, 1, 5]
];
var invalidData = [
[8, 3, 5, 4, 1, 6, 9, 2, 7],
[2, 9, 6, 8, 5, 7, 4, 3, 1],
[4, 1, 7, 2, 9, 3, 6, 5, 8],
[5, 6, 9, 1, 3, 4, 7, 8, 2],
[1, 2, 3, 6, 7, 8, 5, 4, 9],
[7, 4, 8, 5, 2, 9, 1, 6, 3],
[6, 5, 2, 7, 8, 1, 3, 9, 4],
[9, 8, 1, 3, 4, 5, 2, 7, 6],
[3, 7, 4, 9, 6, 2, 8, 1, 1]
];
var v = new SudokuBoardValidator(validData);
console.log('This sudoku board is: ' + v.check());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment