Advent of Code 2022: Day 6

Find unique subset in Array

by Amy L

HTML

<link rel="stylesheet" href="https://adventofcode.com/static/style.css?30">
<h1><a href="https://adventofcode.com/2022/day/6" target="_blank">Day 6</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;
}

TypeScript

const PACKET_MARKER_LENGTH = 4;
const MESSAGE_MARKER_LENGTH = 14;
function Day6(input: string) {
  function solvePart1(input: string) {
    return findStartingMarker(input, PACKET_MARKER_LENGTH);
  }
  function solvePart2(input: string) {
    return findStartingMarker(input, MESSAGE_MARKER_LENGTH);
  }
  const part1 = solvePart1(input);
  const part2 = solvePart2(input);
  return {part1, part2};
}
document.addEventListener('DOMContentLoaded', () => {
  getInputData('INPUT_DATA', (input: string) => {
  	const answers = Day6(input);
    const [answer1El, answer2El] = [
      document.getElementById('answer1'),
      document.getElementById('answer2')
    ];
    (answer1El as HTMLTextAreaElement).value = answers.part1 as unknown as string;
    (answer2El as HTMLTextAreaElement).value = answers.part2 as unknown as string;
  });
});

/*******************************************************************
	Utility libs
**/
function findStartingMarker(datastream: string, markerLength: number): number | null {
  if (datastream.length >= markerLength) {
    for (let start = 0; start < datastream.length - markerLength; start++) {
      const endOfMarker: number = start + markerLength;
      const testString: string = datastream.substring(start, endOfMarker);
      if (isUnique(testString, markerLength)) {
        return endOfMarker;
      }
    }
  }
  return null;
}
function isUnique(text: string, length: number): boolean {
	const chars = new	Set(text);
  return chars.size === length;
}
function getInputData(inputId: string, callback: (value: string) => void): void {
  const dataEl = document.getElementById(inputId) as HTMLTextAreaElement;
  dataEl.addEventListener('input', () => callback(dataEl.value));
  if (dataEl.value) callback(dataEl.value)
}