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,...