diff --git a/deno.json b/deno.json index 6b4eaa3..ff01145 100644 --- a/deno.json +++ b/deno.json @@ -28,6 +28,7 @@ "Day01": "cd ./src/01_Calories && deno run --allow-read=./input.txt Calories.ts", "Day02": "cd ./src/02_RockPaperScissors && deno run --allow-read=./input.txt RockPaperScissors.ts", "Day03": "cd ./src/03_RucksackReorganization && deno run --allow-read=./input.txt RucksackReorganization.ts", - "Day04": "cd ./src/04_CampCleanup && deno run --allow-read=./input.txt CampCleanup.ts" + "Day04": "cd ./src/04_CampCleanup && deno run --allow-read=./input.txt CampCleanup.ts", + "Day05": "cd ./src/05_SupplyStacks && deno run --allow-read=./input.txt SupplyStacks.ts" } } diff --git a/src/05_SupplyStacks/SupplyStacks.ts b/src/05_SupplyStacks/SupplyStacks.ts new file mode 100644 index 0000000..53c7868 --- /dev/null +++ b/src/05_SupplyStacks/SupplyStacks.ts @@ -0,0 +1,70 @@ +type stack = string[]; +type cargo = stack[]; +type instruction = { + amount: number; + from: number; + to: number; +}; + +function getInitialData(): [cargo, instruction[]] { + const input = Deno.readTextFileSync('./input.txt').trimEnd(); + const [stackInput, instructionInput] = input + .split('\n\n') + .map((data) => data.split('\n')); + + // Parse Crate Data + const columns = stackInput.pop()!.trim().split(/\s+/); + const cargoMap = columns.map((col) => -3 + parseInt(col) * 4); + + const cargo: cargo = cargoMap.map((_) => [] as stack); + for (const layer of stackInput) { + cargoMap.forEach((pos: number, index: number) => { + const crate = layer.at(pos); + if (crate && crate !== ' ') cargo[index].push(crate); + }); + } + cargo.forEach((stack) => { + stack.reverse(); + }); + + // Parse Instruction Data + const instructions: instruction[] = []; + for (const line of instructionInput) { + const instruction = line.match( + /^move (\d+) from (\d+) to (\d+)$/, + )! as string[]; + instructions.push({ + amount: parseInt(instruction[1]), + from: parseInt(instruction[2]) - 1, + to: parseInt(instruction[3]) - 1, + }); + } + return [cargo, instructions]; +} + +function moveCratesPart1(cargo: cargo, instructions: instruction[]) { + for (const instruction of instructions) { + let count = 0; + while (count < instruction.amount) { + cargo[instruction.to].push(cargo[instruction.from].pop()!); + count++; + } + } + return cargo.reduce((prev, cur) => prev + cur.at(-1), ''); +} + +function moveCratesPart2(cargo: cargo, instructions: instruction[]) { + for (const instruction of instructions) { + cargo[instruction.to].push( + ...cargo[instruction.from].splice(-instruction.amount), + ); + } + return cargo.reduce((prev, cur) => prev + cur.at(-1), ''); +} + +const [cargo, instructions] = getInitialData(); +console.log( + `Solution Part 1:`, + moveCratesPart1(structuredClone(cargo), instructions), +); +console.log(`Solution Part 2:`, moveCratesPart2(cargo, instructions)); diff --git a/src/05_SupplyStacks/input.txt b/src/05_SupplyStacks/input.txt new file mode 100644 index 0000000..9f9e78d --- /dev/null +++ b/src/05_SupplyStacks/input.txt @@ -0,0 +1,514 @@ +[V] [B] [F] +[N] [Q] [W] [R] [B] +[F] [D] [S] [B] [L] [P] +[S] [J] [C] [F] [C] [D] [G] +[M] [M] [H] [L] [P] [N] [P] [V] +[P] [L] [D] [C] [T] [Q] [R] [S] [J] +[H] [R] [Q] [S] [V] [R] [V] [Z] [S] +[J] [S] [N] [R] [M] [T] [G] [C] [D] + 1 2 3 4 5 6 7 8 9 + +move 1 from 8 to 4 +move 1 from 7 to 8 +move 1 from 6 to 3 +move 2 from 6 to 5 +move 8 from 5 to 1 +move 5 from 3 to 8 +move 1 from 7 to 8 +move 8 from 1 to 2 +move 3 from 3 to 9 +move 13 from 8 to 7 +move 2 from 1 to 2 +move 1 from 6 to 2 +move 2 from 1 to 7 +move 4 from 4 to 2 +move 10 from 9 to 4 +move 7 from 4 to 1 +move 1 from 6 to 7 +move 2 from 4 to 5 +move 1 from 5 to 2 +move 1 from 5 to 8 +move 3 from 1 to 5 +move 2 from 4 to 6 +move 2 from 6 to 4 +move 2 from 4 to 5 +move 5 from 1 to 5 +move 1 from 9 to 5 +move 1 from 8 to 5 +move 14 from 2 to 6 +move 12 from 7 to 4 +move 4 from 6 to 7 +move 3 from 6 to 4 +move 4 from 4 to 9 +move 2 from 4 to 6 +move 2 from 9 to 3 +move 9 from 4 to 3 +move 2 from 1 to 6 +move 5 from 7 to 3 +move 4 from 7 to 8 +move 2 from 6 to 7 +move 3 from 6 to 7 +move 10 from 5 to 8 +move 8 from 8 to 9 +move 10 from 9 to 7 +move 12 from 7 to 5 +move 1 from 1 to 5 +move 3 from 7 to 2 +move 10 from 3 to 7 +move 6 from 5 to 7 +move 2 from 6 to 1 +move 12 from 2 to 7 +move 3 from 3 to 1 +move 1 from 6 to 5 +move 10 from 5 to 7 +move 3 from 3 to 4 +move 34 from 7 to 1 +move 2 from 6 to 9 +move 1 from 6 to 3 +move 3 from 1 to 3 +move 1 from 7 to 3 +move 3 from 3 to 6 +move 1 from 4 to 3 +move 22 from 1 to 6 +move 2 from 9 to 7 +move 2 from 4 to 9 +move 12 from 6 to 8 +move 1 from 7 to 6 +move 4 from 8 to 2 +move 1 from 7 to 1 +move 6 from 8 to 9 +move 1 from 2 to 5 +move 1 from 2 to 7 +move 13 from 1 to 2 +move 2 from 3 to 1 +move 4 from 7 to 5 +move 3 from 9 to 4 +move 1 from 1 to 8 +move 4 from 5 to 2 +move 12 from 6 to 2 +move 3 from 1 to 3 +move 1 from 4 to 1 +move 9 from 8 to 5 +move 6 from 5 to 7 +move 2 from 4 to 5 +move 5 from 9 to 6 +move 5 from 3 to 7 +move 30 from 2 to 6 +move 11 from 7 to 9 +move 36 from 6 to 3 +move 10 from 9 to 3 +move 1 from 6 to 5 +move 3 from 5 to 2 +move 2 from 5 to 2 +move 28 from 3 to 4 +move 6 from 4 to 1 +move 1 from 2 to 3 +move 2 from 5 to 2 +move 6 from 1 to 7 +move 1 from 1 to 6 +move 6 from 3 to 5 +move 6 from 7 to 2 +move 1 from 6 to 4 +move 2 from 2 to 6 +move 8 from 2 to 1 +move 3 from 2 to 4 +move 2 from 3 to 4 +move 4 from 3 to 4 +move 1 from 6 to 1 +move 2 from 1 to 8 +move 1 from 6 to 4 +move 1 from 9 to 3 +move 2 from 5 to 4 +move 1 from 8 to 7 +move 1 from 7 to 9 +move 1 from 3 to 5 +move 1 from 8 to 6 +move 34 from 4 to 9 +move 13 from 9 to 8 +move 1 from 8 to 2 +move 1 from 2 to 1 +move 4 from 5 to 1 +move 9 from 8 to 7 +move 11 from 1 to 3 +move 1 from 4 to 2 +move 1 from 6 to 7 +move 1 from 9 to 4 +move 1 from 4 to 1 +move 1 from 5 to 3 +move 5 from 7 to 8 +move 1 from 2 to 5 +move 1 from 5 to 1 +move 21 from 9 to 5 +move 19 from 3 to 4 +move 17 from 4 to 6 +move 2 from 8 to 4 +move 2 from 6 to 8 +move 2 from 6 to 9 +move 2 from 7 to 6 +move 1 from 4 to 9 +move 6 from 5 to 6 +move 1 from 9 to 8 +move 8 from 5 to 7 +move 15 from 6 to 2 +move 1 from 9 to 7 +move 2 from 1 to 6 +move 3 from 4 to 7 +move 1 from 1 to 6 +move 3 from 5 to 4 +move 2 from 5 to 6 +move 2 from 4 to 1 +move 13 from 7 to 8 +move 2 from 6 to 4 +move 3 from 2 to 4 +move 2 from 7 to 6 +move 5 from 4 to 6 +move 4 from 2 to 6 +move 1 from 1 to 9 +move 18 from 8 to 3 +move 1 from 4 to 5 +move 1 from 2 to 7 +move 15 from 3 to 1 +move 1 from 5 to 1 +move 3 from 3 to 4 +move 1 from 5 to 4 +move 1 from 5 to 6 +move 1 from 6 to 8 +move 2 from 8 to 2 +move 3 from 1 to 8 +move 6 from 2 to 8 +move 1 from 7 to 6 +move 12 from 8 to 5 +move 2 from 9 to 6 +move 6 from 1 to 5 +move 9 from 5 to 3 +move 1 from 2 to 8 +move 20 from 6 to 9 +move 3 from 6 to 7 +move 1 from 7 to 1 +move 7 from 3 to 4 +move 2 from 7 to 2 +move 1 from 8 to 7 +move 8 from 4 to 1 +move 11 from 1 to 7 +move 10 from 7 to 6 +move 2 from 4 to 9 +move 21 from 9 to 3 +move 6 from 5 to 9 +move 6 from 3 to 2 +move 1 from 4 to 5 +move 1 from 7 to 9 +move 8 from 3 to 2 +move 9 from 2 to 1 +move 14 from 1 to 6 +move 1 from 1 to 7 +move 4 from 3 to 8 +move 3 from 8 to 7 +move 5 from 7 to 4 +move 3 from 6 to 9 +move 2 from 3 to 7 +move 3 from 5 to 6 +move 1 from 5 to 6 +move 2 from 7 to 9 +move 1 from 8 to 3 +move 22 from 6 to 5 +move 3 from 9 to 4 +move 3 from 6 to 1 +move 5 from 4 to 6 +move 9 from 2 to 8 +move 4 from 6 to 1 +move 1 from 3 to 2 +move 1 from 2 to 3 +move 6 from 8 to 1 +move 2 from 4 to 3 +move 10 from 1 to 7 +move 2 from 8 to 7 +move 1 from 9 to 6 +move 4 from 3 to 5 +move 1 from 8 to 3 +move 4 from 9 to 8 +move 1 from 4 to 3 +move 1 from 3 to 8 +move 3 from 7 to 6 +move 1 from 1 to 5 +move 10 from 5 to 9 +move 5 from 6 to 4 +move 5 from 8 to 5 +move 4 from 9 to 8 +move 3 from 3 to 9 +move 2 from 8 to 6 +move 5 from 7 to 5 +move 1 from 4 to 1 +move 1 from 1 to 2 +move 2 from 8 to 6 +move 1 from 2 to 1 +move 1 from 7 to 2 +move 1 from 1 to 5 +move 28 from 5 to 9 +move 3 from 6 to 1 +move 1 from 6 to 9 +move 1 from 2 to 9 +move 2 from 1 to 2 +move 2 from 7 to 5 +move 1 from 7 to 5 +move 1 from 2 to 5 +move 3 from 1 to 9 +move 1 from 5 to 8 +move 15 from 9 to 2 +move 11 from 9 to 4 +move 11 from 4 to 7 +move 2 from 4 to 1 +move 7 from 7 to 8 +move 1 from 1 to 4 +move 20 from 9 to 1 +move 2 from 7 to 8 +move 1 from 4 to 6 +move 1 from 6 to 2 +move 2 from 7 to 5 +move 1 from 9 to 6 +move 1 from 4 to 9 +move 4 from 5 to 2 +move 1 from 6 to 8 +move 1 from 4 to 9 +move 11 from 8 to 3 +move 1 from 1 to 9 +move 1 from 5 to 9 +move 1 from 2 to 6 +move 4 from 9 to 8 +move 4 from 8 to 7 +move 10 from 1 to 6 +move 7 from 1 to 5 +move 8 from 3 to 4 +move 2 from 3 to 5 +move 3 from 7 to 4 +move 1 from 4 to 5 +move 2 from 1 to 6 +move 9 from 2 to 6 +move 1 from 7 to 9 +move 1 from 3 to 2 +move 7 from 4 to 3 +move 3 from 3 to 7 +move 5 from 2 to 3 +move 1 from 1 to 9 +move 2 from 2 to 7 +move 1 from 4 to 6 +move 3 from 5 to 6 +move 4 from 7 to 6 +move 1 from 7 to 4 +move 1 from 4 to 7 +move 1 from 2 to 8 +move 1 from 7 to 1 +move 27 from 6 to 2 +move 1 from 4 to 1 +move 7 from 5 to 7 +move 1 from 4 to 1 +move 1 from 8 to 3 +move 3 from 7 to 3 +move 2 from 1 to 6 +move 2 from 9 to 1 +move 18 from 2 to 1 +move 2 from 7 to 5 +move 12 from 3 to 4 +move 1 from 5 to 6 +move 3 from 6 to 1 +move 24 from 1 to 8 +move 9 from 2 to 4 +move 3 from 2 to 1 +move 2 from 6 to 3 +move 1 from 6 to 9 +move 1 from 5 to 6 +move 1 from 6 to 2 +move 1 from 1 to 7 +move 1 from 2 to 1 +move 1 from 1 to 2 +move 3 from 7 to 2 +move 2 from 1 to 4 +move 8 from 4 to 5 +move 22 from 8 to 1 +move 1 from 8 to 1 +move 13 from 4 to 1 +move 1 from 8 to 5 +move 3 from 3 to 1 +move 1 from 2 to 7 +move 38 from 1 to 6 +move 27 from 6 to 1 +move 2 from 2 to 9 +move 3 from 9 to 8 +move 2 from 8 to 6 +move 1 from 8 to 3 +move 1 from 2 to 1 +move 1 from 3 to 6 +move 1 from 2 to 3 +move 1 from 7 to 6 +move 7 from 6 to 3 +move 20 from 1 to 4 +move 6 from 1 to 6 +move 17 from 4 to 7 +move 3 from 6 to 5 +move 14 from 7 to 9 +move 8 from 5 to 7 +move 3 from 1 to 6 +move 3 from 3 to 1 +move 2 from 4 to 1 +move 4 from 5 to 1 +move 9 from 6 to 2 +move 3 from 6 to 4 +move 4 from 7 to 8 +move 4 from 1 to 6 +move 2 from 3 to 1 +move 6 from 6 to 7 +move 4 from 8 to 7 +move 4 from 2 to 1 +move 4 from 2 to 3 +move 4 from 9 to 5 +move 8 from 9 to 5 +move 1 from 9 to 5 +move 1 from 2 to 1 +move 16 from 7 to 2 +move 10 from 2 to 9 +move 11 from 9 to 8 +move 4 from 3 to 5 +move 3 from 1 to 4 +move 13 from 5 to 7 +move 10 from 8 to 5 +move 2 from 1 to 5 +move 11 from 7 to 4 +move 2 from 3 to 6 +move 3 from 7 to 6 +move 1 from 3 to 2 +move 1 from 1 to 8 +move 2 from 8 to 4 +move 3 from 1 to 2 +move 4 from 6 to 1 +move 7 from 1 to 9 +move 1 from 6 to 7 +move 2 from 5 to 8 +move 1 from 2 to 9 +move 1 from 7 to 8 +move 5 from 5 to 8 +move 1 from 2 to 3 +move 4 from 2 to 5 +move 17 from 4 to 1 +move 10 from 5 to 9 +move 2 from 4 to 2 +move 2 from 4 to 1 +move 1 from 4 to 9 +move 1 from 3 to 7 +move 1 from 7 to 8 +move 12 from 9 to 2 +move 1 from 2 to 4 +move 1 from 4 to 1 +move 1 from 1 to 9 +move 1 from 8 to 1 +move 8 from 8 to 3 +move 2 from 5 to 1 +move 3 from 1 to 9 +move 1 from 2 to 6 +move 4 from 3 to 7 +move 1 from 7 to 6 +move 10 from 9 to 2 +move 1 from 5 to 9 +move 1 from 9 to 3 +move 17 from 1 to 6 +move 2 from 1 to 2 +move 11 from 6 to 7 +move 2 from 2 to 9 +move 2 from 9 to 5 +move 12 from 7 to 9 +move 20 from 2 to 7 +move 5 from 9 to 5 +move 21 from 7 to 1 +move 2 from 6 to 4 +move 11 from 1 to 4 +move 5 from 4 to 6 +move 1 from 7 to 8 +move 5 from 9 to 3 +move 5 from 2 to 8 +move 3 from 9 to 3 +move 2 from 8 to 7 +move 2 from 1 to 7 +move 10 from 6 to 3 +move 1 from 2 to 6 +move 2 from 8 to 5 +move 1 from 6 to 5 +move 2 from 4 to 9 +move 1 from 4 to 5 +move 8 from 1 to 6 +move 4 from 4 to 8 +move 6 from 8 to 4 +move 21 from 3 to 9 +move 5 from 9 to 2 +move 4 from 7 to 9 +move 22 from 9 to 3 +move 9 from 6 to 4 +move 2 from 2 to 6 +move 2 from 2 to 1 +move 2 from 5 to 7 +move 7 from 5 to 4 +move 22 from 4 to 2 +move 2 from 5 to 4 +move 16 from 2 to 5 +move 2 from 6 to 2 +move 13 from 3 to 4 +move 5 from 5 to 7 +move 15 from 4 to 7 +move 3 from 2 to 3 +move 3 from 2 to 5 +move 1 from 1 to 2 +move 1 from 2 to 4 +move 6 from 5 to 9 +move 4 from 3 to 6 +move 2 from 5 to 9 +move 1 from 2 to 7 +move 1 from 1 to 9 +move 2 from 4 to 5 +move 19 from 7 to 8 +move 1 from 6 to 5 +move 1 from 5 to 1 +move 1 from 9 to 4 +move 5 from 8 to 1 +move 3 from 8 to 1 +move 7 from 5 to 6 +move 3 from 7 to 1 +move 1 from 2 to 5 +move 4 from 9 to 8 +move 2 from 5 to 6 +move 10 from 1 to 4 +move 1 from 7 to 2 +move 6 from 3 to 4 +move 9 from 4 to 3 +move 2 from 2 to 8 +move 2 from 9 to 5 +move 5 from 8 to 3 +move 1 from 1 to 5 +move 2 from 5 to 6 +move 1 from 1 to 7 +move 2 from 9 to 7 +move 8 from 4 to 7 +move 3 from 3 to 9 +move 4 from 6 to 3 +move 1 from 5 to 3 +move 1 from 7 to 2 +move 1 from 2 to 1 +move 1 from 6 to 5 +move 1 from 5 to 2 +move 10 from 7 to 4 +move 10 from 4 to 1 +move 10 from 1 to 8 +move 1 from 9 to 6 +move 1 from 1 to 4 +move 11 from 8 to 1 +move 2 from 9 to 5 +move 5 from 6 to 3 +move 1 from 3 to 8 +move 4 from 1 to 3 +move 5 from 3 to 8 +move 1 from 4 to 7 +move 1 from 7 to 2 +move 13 from 3 to 5 +move 2 from 2 to 1 +move 4 from 3 to 1 +move 4 from 5 to 6 +move 3 from 6 to 2 +move 4 from 5 to 4 +move 8 from 8 to 7 +move 1 from 3 to 9