| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- const fs = require('fs');
- const readline = require('readline');
- function finalize(map, posX, posY) {
- let i =1;
- let visibility = [ true, true, true, true ];
- let globalVis = 0;
- let maxDist = [ posX, map.length -posX -1, posY, map[0].length -posY -1 ];
- let cross = [];
- do {
- cross = [ map[posX-i]?.[posY], map[posX+i]?.[posY], map[posX]?.[posY-i], map[posX]?.[posY+i] ];
- cross.forEach((tree, index) => {
- if (tree && tree.height >= map[posX][posY].height && visibility[index]) {
- visibility[index] = false;
- globalVis++;
- maxDist[index] = i;
- }
- });
- ++i;
- }
- while (!cross.every(x => !x) && !visibility.every(i => !i));
- map[posX][posY].visible = globalVis < 4;
- map[posX][posY].maxDist = maxDist.reduce((acc, i) => acc ? acc * i : i);
- }
- function print(map) {
- const colorMap = [39, 32, 32, 92, 33, 93, 93, 91, 31, 31];
- for (let i of map) {
- let buf = "";
- for (let j of i)
- buf += '\033[' +colorMap[j.height] +'mx';
- console.log(buf + '\033[39m');
- }
- }
- async function main() {
- let lines = [];
- let visibleCount = 0;
- let maxScenic = 0;
- for await (let line of readline.createInterface({ input: process.stdin }))
- lines.push(line.split("").map(i => { return { height: parseInt(i), visible: 0, maxDist: 0 };}));
- for (let i =0; i < lines.length; ++i) {
- for (let j =0; j < lines[i].length; ++j) {
- finalize(lines, i, j);
- if (lines[i][j].visible) visibleCount++;
- maxScenic = Math.max(maxScenic, lines[i][j].maxDist);
- }
- }
- print(lines);
- console.log("Number of visible trees: ", visibleCount);
- console.log("Max scenic score: ", maxScenic);
- };
- (main());
|