main.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const fs = require('fs');
  2. const readline = require('readline');
  3. function finalize(map, posX, posY) {
  4. let i =1;
  5. let visibility = [ true, true, true, true ];
  6. let globalVis = 0;
  7. let maxDist = [ posX, map.length -posX -1, posY, map[0].length -posY -1 ];
  8. let cross = [];
  9. do {
  10. cross = [ map[posX-i]?.[posY], map[posX+i]?.[posY], map[posX]?.[posY-i], map[posX]?.[posY+i] ];
  11. cross.forEach((tree, index) => {
  12. if (tree && tree.height >= map[posX][posY].height && visibility[index]) {
  13. visibility[index] = false;
  14. globalVis++;
  15. maxDist[index] = i;
  16. }
  17. });
  18. ++i;
  19. }
  20. while (!cross.every(x => !x) && !visibility.every(i => !i));
  21. map[posX][posY].visible = globalVis < 4;
  22. map[posX][posY].maxDist = maxDist.reduce((acc, i) => acc ? acc * i : i);
  23. }
  24. function print(map) {
  25. const colorMap = [39, 32, 32, 92, 33, 93, 93, 91, 31, 31];
  26. for (let i of map) {
  27. let buf = "";
  28. for (let j of i)
  29. buf += '\033[' +colorMap[j.height] +'mx';
  30. console.log(buf + '\033[39m');
  31. }
  32. }
  33. async function main() {
  34. let lines = [];
  35. let visibleCount = 0;
  36. let maxScenic = 0;
  37. for await (let line of readline.createInterface({ input: process.stdin }))
  38. lines.push(line.split("").map(i => { return { height: parseInt(i), visible: 0, maxDist: 0 };}));
  39. for (let i =0; i < lines.length; ++i) {
  40. for (let j =0; j < lines[i].length; ++j) {
  41. finalize(lines, i, j);
  42. if (lines[i][j].visible) visibleCount++;
  43. maxScenic = Math.max(maxScenic, lines[i][j].maxDist);
  44. }
  45. }
  46. print(lines);
  47. console.log("Number of visible trees: ", visibleCount);
  48. console.log("Max scenic score: ", maxScenic);
  49. };
  50. (main());