130 lines
3.3 KiB
TypeScript
130 lines
3.3 KiB
TypeScript
const sample = await Deno.readTextFile("sample.txt");
|
|
const input = await Deno.readTextFile("input.txt");
|
|
|
|
/**** PART 1 ********************************/
|
|
|
|
const solvePart1 = (data: string): number => {
|
|
const grid = data
|
|
.split("\n")
|
|
.filter(Boolean)
|
|
.map((line) => line.split("").filter(Boolean).map(parseFloat));
|
|
|
|
let counter = 0;
|
|
|
|
for (let y = 0; y < grid.length; y += 1) {
|
|
for (let x = 0; x < grid[0].length; x += 1) {
|
|
const height = grid[y][x];
|
|
let visibleUntil = true;
|
|
let visibleFrom = true;
|
|
|
|
/* Detect view on Y */
|
|
let verticalView = true;
|
|
for (let y1 = 0; y1 < grid.length; y1 += 1) {
|
|
if (y1 < y) {
|
|
visibleUntil = visibleUntil && grid[y1][x] < height;
|
|
}
|
|
if (y1 > y) {
|
|
visibleFrom = visibleFrom && grid[y1][x] < height;
|
|
}
|
|
}
|
|
verticalView = verticalView && (visibleUntil || visibleFrom);
|
|
|
|
/* Detect view on X */
|
|
let horizontalView = true;
|
|
visibleUntil = true;
|
|
visibleFrom = true;
|
|
for (let x1 = 0; x1 < grid.length; x1 += 1) {
|
|
if (x1 < x) {
|
|
visibleUntil = visibleUntil && grid[y][x1] < height;
|
|
}
|
|
if (x1 > x) {
|
|
visibleFrom = visibleFrom && grid[y][x1] < height;
|
|
}
|
|
}
|
|
horizontalView = horizontalView && (visibleUntil || visibleFrom);
|
|
if (horizontalView || verticalView) {
|
|
counter = counter + 1;
|
|
}
|
|
}
|
|
}
|
|
return counter;
|
|
};
|
|
|
|
console.log("Sample:", solvePart1(sample)); // 21
|
|
console.log("Input", solvePart1(input)); // 1851
|
|
|
|
/**** PART 2 ********************************/
|
|
|
|
const solvePart2 = (data: string): number => {
|
|
const grid = data
|
|
.split("\n")
|
|
.filter(Boolean)
|
|
.map((line) => line.split("").filter(Boolean).map(parseFloat));
|
|
|
|
let highestCounter = 0;
|
|
for (let y = 0; y < grid.length; y += 1) {
|
|
const row = grid[y];
|
|
for (let x = 0; x < row.length; x += 1) {
|
|
let counter = 1;
|
|
const height = row[x];
|
|
|
|
let yCounter = 0;
|
|
for (let y2 = y + 1; y2 < grid.length; y2 += 1) {
|
|
const treeHeight = grid[y2][x];
|
|
if (treeHeight === undefined) {
|
|
break;
|
|
}
|
|
yCounter += 1;
|
|
if (treeHeight >= height) {
|
|
break;
|
|
}
|
|
}
|
|
counter = yCounter;
|
|
yCounter = 0;
|
|
for (let y2 = y - 1; y2 >= 0; y2 -= 1) {
|
|
const treeHeight = grid[y2][x];
|
|
if (treeHeight === undefined) {
|
|
break;
|
|
}
|
|
yCounter += 1;
|
|
if (treeHeight >= height) {
|
|
break;
|
|
}
|
|
}
|
|
counter *= yCounter;
|
|
let xCounter = 0;
|
|
for (let x2 = x + 1; x2 < row.length; x2 += 1) {
|
|
const treeHeight = grid[y][x2];
|
|
if (treeHeight === undefined) {
|
|
break;
|
|
}
|
|
xCounter += 1;
|
|
if (treeHeight >= height) {
|
|
break;
|
|
}
|
|
}
|
|
counter *= xCounter;
|
|
xCounter = 0;
|
|
for (let x2 = x - 1; x2 >= 0; x2 -= 1) {
|
|
const treeHeight = grid[y][x2];
|
|
if (treeHeight === undefined) {
|
|
break;
|
|
}
|
|
xCounter += 1;
|
|
if (treeHeight >= height) {
|
|
break;
|
|
}
|
|
}
|
|
counter *= xCounter;
|
|
if (counter > highestCounter) {
|
|
highestCounter = counter;
|
|
}
|
|
}
|
|
}
|
|
|
|
return highestCounter;
|
|
};
|
|
|
|
console.log("Sample:", solvePart2(sample)); // 8
|
|
console.log("Input", solvePart2(input)); // 574080
|