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