Advent of Code 2022: Day 5
Execute instructions to move items between Arrays
by Amy L
HTML
<link rel="stylesheet" href="https://adventofcode.com/static/style.css?30">
<h1><a href="https://adventofcode.com/2022/day/5" target="_blank">Day 5</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 CRANES: {
CRATE_MOVER_9000: Crane;
CRATE_MOVER_9001: Crane;
} = {
CRATE_MOVER_9000: {
name: 'CrateMover 9000',
move: (source: Crate[], destination: Crate[], numberOfCrates: number): void => {
for (let i = 0; i < numberOfCrates; i++) {
const crate: Crate = source.pop() as Crate;
destination.push(crate);
}
}
},
CRATE_MOVER_9001: {
name: 'CrateMover 9001',
move: (source: Crate[], destination: Crate[], numberOfCrates: number): void => {
const removedCrates: Crate[] = source.splice(-numberOfCrates);
destination.push(...removedCrates);
}
}
};
function Day5(input: string) {
function solvePart1({instructions, stacks}: {instructions: Instruction[], stacks: Stacks}) {
executeInstructions(instructions, stacks, CRANES.CRATE_MOVER_9000);
return getTopCratesOnEachStack(stacks).join('');
}
function solvePart2({instructions, stacks}: {instructions: Instruction[], stacks: Stacks}) {
executeInstructions(instructions, stacks, CRANES.CRATE_MOVER_9001);
return getTopCratesOnEachStack(stacks).join('');
}
const part1 = solvePart1(parseDrawing(input));
const part2 = solvePart2(parseDrawing(input));
return {part1, part2};
}
document.addEventListener('DOMContentLoaded', () => {
getInputData('INPUT_DATA', (input) => {
const answers = Day5(input);
const [answer1El, answer2El] = [
document.getElementById('answer1'),
document.getElementById('answer2')
];
(answer1El as HTMLTextAreaElement).value = answers.part1;
(answer2El as HTMLTextAreaElement).value = answers.part2;
});
});
/*******************************************************************
Utility libs
**/
function parseDrawing(input: string): {instructions: Instruction[], stacks: Stacks} {
const [cratesDrawing, instructionsText] = input.split('\n\n');
//console.log(cratesDrawing)
return {
stacks: parseStartingCratesDrawing(cratesDrawing),
instructions: parseInstructions(instructionsText)
};
...