Files
advent-of-code-2022/2022/08/solution.ts
2022-12-19 13:53:33 +01:00

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