Advent of Code 2022: Day 12
Climbing shortest path up mountain 🏔
by Amy L
HTML
<link rel="stylesheet" href="https://adventofcode.com/static/style.css?30">
<h1><a href="https://adventofcode.com/2022/day/12" target="_blank">Day 12</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>
<canvas id="map"></canvas>
<table id="adjacencyMatrix" class="hidden">
<caption>Adjacency Matrix</caption>
<thead></thead>
<tbody></tbody>
</table>
CSS
.hidden { display: none; }
th .elevation {
font-size: 12px;
}
th .coord {
font-size: 9px;
}
td {
border: 1px solid #666;
font-size: 7px;
text-align: center;
height: 16px;
width: 16px;
}
td.exist {
background-color: green;
}
td.self {
border: 1px solid #444;
}
td .bit {
visibility: hidden;
}
TypeScript
const START = 'S';
const END = 'E';
const ELEVATIONS = {
START: 'a',
END: 'z'
};
const PIXEL_SIZE = 10;
function Day12() {
async function solvePart1(inputData: string) {
const {start, end, list, map} = parseHeightMap(inputData);
const canvas = drawMap(map);
//const adjacencyMatrix = getAdjacencyMatrix(list);
//renderMatrix(document.querySelector('#adjacencyMatrix'), adjacencyMatrix, list);
const result = await dijkstra<Square>(list, start, end, drawWalk(canvas));
drawPath(canvas, result.path);
return result.distance;
}
async function solvePart2(inputData: string) {
let {end, list} = parseHeightMap(inputData);
const lowestElevations = list.filter((square: Square) => square.elevationValue === ELEVATIONS.START.charCodeAt(0));
const total = lowestElevations.length;
let lowestSteps: number = null;
for (let i = 0; i < total; i++) {
const result = await dijkstra<Square>(list, lowestElevations[i], end);
if (result !== null) {
if (lowestSteps === null) {
lowestSteps = result.distance;
} else {
if (result.distance < lowestSteps) {
lowestSteps = result.distance;
}
}
}
list = parseHeightMap(inputData).list;
}
return lowestSteps;
}
return {
solvePart1,
solvePart2
};
}
document.addEventListener('DOMContentLoaded', () => {
getInputData('INPUT_DATA', (input) => {
const {solvePart1, solvePart2} = Day12();
solvePart1(input).then((answer) => {
(document.getElementById('answer1') as HTMLInputElement).value = answer as any;
});
solvePart2(input).then((answer) => {
(document.getElementById('answer2') as HTMLInputElement).value = answer as any;
});
});
});
/*******************************************************************
Utility libs
**/
function parseHeightMap(input: string): {start: StartSquare, end: EndSquare, list: Square[], map: Square[][]} {
const heightMapData = input
...