Advent of Code 2022: Day 8

Spatial representation with Arrays

by Amy L

HTML

<link rel="stylesheet" href="https://adventofcode.com/static/style.css?30">
<h1><a href="https://adventofcode.com/2022/day/8" target="_blank">Day 8</a></h1>
<diV class="puzzle-input">
  <label for="INPUT_DATA">Input</label>
  <textarea id="INPUT_DATA" autocomplete="off" placeholder="paste your input here" rows="7" cols="50"></textarea>
</diV>
<dl>
<dt>Part 1</dt>
  <dd>
    <label>Answer:
      <input type="text" id="answer1" readonly />
    </label>
  </dd>
  
  <dt>Part 2</dt>
  <dd>
    <label>Answer:
      <input type="text" id="answer2" readonly />
    </label>
  </dd>
</dl>

CSS

dd {
  margin-bottom: 1rem;
}

JavaScript 1.7

function Day8(input) {
  function solvePart1(mapData) {
    const numRows = mapData.length;
    const numColumns = mapData[0].length;
    const perimeter = (2 * numRows) + (2 * numColumns) - 4;
    const numTreesVisible = treesVisibleFromOutside(mapData);
   	return perimeter + numTreesVisible;
  }
  function solvePart2(mapData) {
  	const innerTrees = getScenicTrees(mapData);
  	return innerTrees.sort(sortByScenicScoreDescending)[0].scenicScore;
  }
  const mapData = parseMapInput(input);  
  const part1 = solvePart1(mapData);
  const part2 = solvePart2(mapData);
  return {part1, part2};
}
document.addEventListener('DOMContentLoaded', () => {
  getInputData('INPUT_DATA', (input) => {
  	const answers = Day8(input);
    const [answer1El, answer2El] = [
      document.getElementById('answer1'),
      document.getElementById('answer2')
    ];
    answer1El.value = answers.part1;
    answer2El.value = answers.part2;
  });
});

/*******************************************************************
	Utility libs
**/
function parseMapInput(input) {
	return input
  	.split('\n')
    .map((line) => 
    	line
      	.split('')
    		.map((num) => parseInt(num))
    );
}
function treesVisibleFromOutside(mapData) {
	let numTreesVisible = 0;
  iterateOverEachInnerTree(mapData, (mapData, x, y, height, numRows, numColumns) => {
    const {left, top, bottom, right} = analyzeTree(mapData, x, y, height, numRows, numColumns);
    const isVisible = (
      left.visibleFromOutside || 
      top.visibleFromOutside || 
      bottom.visibleFromOutside || 
      right.visibleFromOutside
    );
    if (isVisible) {
      numTreesVisible++;
    }
  });
	return numTreesVisible;
}
function getScenicTrees(mapData) {
	const visibleTrees = [];
  iterateOverEachInnerTree(mapData, (mapData, x, y, height, numRows, numColumns) => {
    const analyzedTree = analyzeTree(mapData, x, y, height, numRows, numColumns);
    const {scenicScore, visible} = calculateScenicScore(analyzedTree);
    const {left,...