840-magic-squares-in-grid
DevGod needs to write a blog entry for this problem!
/**
* @param {number[][]} grid
* @return {number}
*/
var numMagicSquaresInside = function (grid) {
if (grid.length < 3 || grid[0].length < 3) {
return 0;
}
function checkMagicSquare(row, col) {
let nums = new Set();
for (let I = 0; I < 3; I++) {
for (let J = 0; J < 3; J++) {
if (grid[row + I][col + J] < 1 || grid[row + I][col + J] > 9) {
return false;
}
nums.add(grid[row + I][col + J]);
}
}
if (nums.size != 9) {
return false;
}
let sums = new Set([
_.sum([grid[row][col], grid[row][col + 1], grid[row][col + 2]]),
_.sum([grid[row + 1][col], grid[row + 1][col + 1], grid[row + 1][col + 2]]),
_.sum([grid[row + 2][col], grid[row + 2][col + 1], grid[row + 2][col + 2]]),
_.sum([grid[row][col], grid[row + 1][col], grid[row + 2][col]]),
_.sum([grid[row][col + 1], grid[row + 1][col + 1], grid[row + 2][col + 1]]),
_.sum([grid[row][col + 2], grid[row + 1][col + 2], grid[row + 2][col + 2]]),
_.sum([grid[row][col], grid[row + 1][col + 1], grid[row + 2][col + 2]]),
_.sum([grid[row + 2][col], grid[row + 1][col + 1], grid[row][col + 2]])
]);
if (sums.size !== 1) {
return false;
}
return true;
}
let size = 3;
let score = 0;
for (let row = 0; row <= grid.length - size; row++) {
for (let col = 0; col <= grid[0].length - size; col++) {
if (checkMagicSquare(row, col)) {
score++;
}
}
}
return score;
};