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());