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)
}