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