Public
Edited
Dec 9, 2022
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
treeGrid = {
return input
.trim()
.split("\n")
.map(row => row
.split("")
.map(h => Number(h))
)
}
Insert cell
function countVisibleTrees (grid) {
const result = [];
const length = grid.length;
const width = grid[0].length;
let visibleTrees = 0;
for (let i = 0; i < length; i++) {
const resultRow = [];
const row = grid[i];
for (let j = 0; j < width; j++) {
const tree = row[j];
// Count perimeter trees
if (
i === 0 ||
i === length - 1 ||
j === 0 ||
j === width - 1
) {
resultRow.push(1);
visibleTrees++;
continue;
}

// Zero height trees can't be seen unless on perimeter
if (tree === 0) {
resultRow.push(0);
continue;
}

let isVisible = false;
// Check west trees
if (!isVisible) {
for (let k = 0; k < j; k++) {
// console.log("west", {k, j, tree, otherTree: row[j]})
if (row[k] >= tree) break; // Found blocking tree, not visible in this direction
if (k === j - 1) isVisible = true;
}
}

// Check east trees
if (!isVisible) {
for (let k = width - 1; k > j; k--) {
// console.log("east", {k, j, tree, otherTree: row[j]})
if (row[k] >= tree) break; // Found blocking tree, not visible in this direction
if (k === j + 1) isVisible = true;
}
}

// Check north trees
if (!isVisible) {
for (let k = 0; k < i; k++) {
if (grid[k][j] >= tree) break; // Found blocking tree, not visible in this direction
if (k === i - 1) isVisible = true;
}
}

// Check south trees
if (!isVisible) {
for (let k = length - 1; k > i; k--) {
if (grid[k][j] >= tree) break; // Found blocking tree, not visible in this direction
if (k === i + 1) isVisible = true;
}
}
if (isVisible) {
resultRow.push(1);
visibleTrees++;
} else {
resultRow.push(0);
}
}
result.push(resultRow);
}

// return result;
return visibleTrees;
}
Insert cell
countVisibleTrees(treeGrid);
Insert cell
Insert cell
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 result;
return highScore;
}
Insert cell
calcScenicScores(treeGrid);
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more