function calcScenicScores (grid) {
const result = [];
const length = grid.length;
const width = grid[0].length;
let highScore = -Infinity;
for (let i = 0; i < length; i++) {
const resultRow = [];
const row = grid[i];
for (let j = 0; j < width; j++) {
const tree = row[j];
let viewDistanceWest = 0;
for (let k = j - 1; k >= 0; k--) {
if (row[k] >= tree || k === 0) {
viewDistanceWest = Math.abs(j - k);
break;
}
}
let viewDistanceEast = 0;
for (let k = j + 1; k <= width - 1; k++) {
if (row[k] >= tree || k === width - 1) {
viewDistanceEast = Math.abs(j - k);
break;
}
}
let viewDistanceNorth = 0;
for (let k = i - 1; k >= 0; k--) {
if (grid[k][j] >= tree || k === 0) {
viewDistanceNorth = Math.abs(i - k);
break;
}
}
let viewDistanceSouth = 0;
for (let k = i + 1; k <= length - 1; k++) {
if (grid[k][j] >= tree || k === length - 1) {
viewDistanceSouth = Math.abs(i - k);
break;
}
}
const score = viewDistanceWest * viewDistanceEast * viewDistanceNorth * viewDistanceSouth;
if (score > highScore) highScore = score;
resultRow.push(score)
}
result.push(resultRow);
}
return highScore;
}