109 lines
2.3 KiB
TypeScript
109 lines
2.3 KiB
TypeScript
import path from 'path';
|
|
import { readFile, sum } from "../../utils";
|
|
|
|
let input = readFile(path.resolve(__dirname, 'input.txt'));
|
|
|
|
let grid: any[] = [];
|
|
|
|
input.split("\n").forEach(element => {
|
|
const arr = element.split("");
|
|
grid.push(arr);
|
|
});
|
|
|
|
const checkVisible = (x: any, y: any) => {
|
|
// Check up
|
|
const treeVal = grid[y][x];
|
|
|
|
let stillVisible = true;
|
|
for (let it = y - 1; it >= 0; it--) {
|
|
if (grid[it][x] >= treeVal) stillVisible = false;
|
|
}
|
|
if (stillVisible) return true;
|
|
|
|
stillVisible = true;
|
|
for (let it = y + 1; it < grid.length; it++) {
|
|
if (grid[it][x] >= treeVal) stillVisible = false;
|
|
}
|
|
if (stillVisible) return true;
|
|
|
|
stillVisible = true;
|
|
for (let it = x - 1; it >= 0; it--) {
|
|
if (grid[y][it] >= treeVal) stillVisible = false;
|
|
}
|
|
if (stillVisible) return true;
|
|
|
|
stillVisible = true;
|
|
for (let it = x + 1; it < grid.length; it++) {
|
|
if (grid[y][it] >= treeVal) stillVisible = false;
|
|
}
|
|
if (stillVisible) return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
let counter = 0;
|
|
for (let x = 1; x < grid.length - 1; x++) {
|
|
for (let y = 1; y < grid.length - 1; y++) {
|
|
if (checkVisible(x, y)) counter++;
|
|
}
|
|
}
|
|
|
|
const edgeTrees = grid.length * 4 - 4;
|
|
|
|
console.log("Part 1:", counter + edgeTrees);
|
|
|
|
const getScenicScore = (x: any, y: any): number => {
|
|
// Check up
|
|
|
|
|
|
const treeVal = grid[y][x];
|
|
let counter = 0;
|
|
let score = 0;
|
|
|
|
for (let it = y - 1; it >= 0; it--) {
|
|
counter++;
|
|
if (grid[it][x] >= treeVal) break;
|
|
}
|
|
score = counter;
|
|
|
|
|
|
counter = 0;
|
|
for (let it = y + 1; it < grid.length; it++) {
|
|
counter++;
|
|
if (grid[it][x] >= treeVal) break;
|
|
}
|
|
|
|
score = score * counter;
|
|
|
|
counter = 0;
|
|
for (let it = x - 1; it >= 0; it--) {
|
|
counter++;
|
|
if (grid[y][it] >= treeVal) break;
|
|
}
|
|
|
|
score = score * counter;
|
|
|
|
counter = 0;
|
|
|
|
for (let it = x + 1; it < grid.length; it++) {
|
|
counter++;
|
|
if (grid[y][it] >= treeVal) break;
|
|
}
|
|
|
|
return score * counter;
|
|
|
|
// counter = 0;
|
|
// return counter;
|
|
|
|
}
|
|
|
|
let scores: number[] = [];
|
|
for (let x = 1; x < grid.length - 1; x++) {
|
|
for (let y = 1; y < grid.length - 1; y++) {
|
|
scores.push(getScenicScore(x,y));
|
|
}
|
|
}
|
|
|
|
console.log("Part 2:" , Math.max(...scores)); |