diff --git a/2022/05/input b/2022/05/input new file mode 100644 index 0000000..dd211b8 --- /dev/null +++ b/2022/05/input @@ -0,0 +1,512 @@ + [C] [Q] [V] + [D] [D] [S] [M] [Z] + [G] [P] [W] [M] [C] [G] + [F] [Z] [C] [D] [P] [S] [W] +[P] [L] [C] [V] [W] [W] [H] [L] +[G] [B] [V] [R] [L] [N] [G] [P] [F] +[R] [T] [S] [S] [S] [T] [D] [L] [P] +[N] [J] [M] [L] [P] [C] [H] [Z] [R] + 1 2 3 4 5 6 7 8 9 + +move 2 from 4 to 6 +move 4 from 5 to 3 +move 6 from 6 to 1 +move 4 from 1 to 4 +move 4 from 9 to 4 +move 7 from 2 to 4 +move 1 from 9 to 3 +move 1 from 2 to 6 +move 2 from 9 to 5 +move 2 from 6 to 8 +move 5 from 8 to 1 +move 2 from 6 to 9 +move 5 from 8 to 3 +move 1 from 5 to 4 +move 3 from 7 to 2 +move 10 from 4 to 7 +move 7 from 4 to 3 +move 1 from 4 to 7 +move 1 from 7 to 9 +move 1 from 2 to 3 +move 11 from 1 to 7 +move 12 from 3 to 7 +move 8 from 3 to 8 +move 29 from 7 to 2 +move 3 from 7 to 3 +move 3 from 9 to 2 +move 4 from 5 to 3 +move 7 from 3 to 5 +move 28 from 2 to 3 +move 1 from 7 to 5 +move 2 from 8 to 5 +move 2 from 4 to 1 +move 2 from 1 to 4 +move 1 from 7 to 6 +move 1 from 7 to 1 +move 3 from 2 to 8 +move 1 from 1 to 7 +move 9 from 5 to 3 +move 12 from 3 to 1 +move 1 from 4 to 3 +move 1 from 6 to 4 +move 3 from 2 to 9 +move 16 from 3 to 7 +move 2 from 9 to 6 +move 5 from 7 to 2 +move 1 from 9 to 7 +move 1 from 4 to 2 +move 13 from 7 to 2 +move 13 from 2 to 7 +move 12 from 7 to 8 +move 2 from 6 to 4 +move 16 from 8 to 1 +move 4 from 3 to 1 +move 3 from 3 to 2 +move 1 from 5 to 7 +move 1 from 5 to 3 +move 3 from 4 to 6 +move 19 from 1 to 3 +move 5 from 8 to 4 +move 6 from 3 to 2 +move 5 from 4 to 2 +move 1 from 7 to 4 +move 1 from 4 to 9 +move 3 from 6 to 7 +move 1 from 9 to 2 +move 16 from 2 to 4 +move 9 from 1 to 8 +move 10 from 4 to 2 +move 2 from 7 to 5 +move 5 from 8 to 4 +move 12 from 2 to 9 +move 2 from 7 to 4 +move 12 from 9 to 5 +move 11 from 5 to 6 +move 3 from 1 to 9 +move 1 from 5 to 7 +move 2 from 9 to 2 +move 10 from 3 to 2 +move 1 from 9 to 2 +move 2 from 8 to 9 +move 1 from 7 to 8 +move 1 from 8 to 4 +move 7 from 2 to 6 +move 1 from 1 to 5 +move 5 from 3 to 1 +move 1 from 5 to 1 +move 2 from 3 to 9 +move 2 from 1 to 6 +move 3 from 9 to 8 +move 14 from 6 to 1 +move 1 from 3 to 5 +move 5 from 4 to 6 +move 1 from 9 to 6 +move 7 from 6 to 9 +move 1 from 6 to 2 +move 8 from 1 to 4 +move 7 from 1 to 7 +move 10 from 2 to 1 +move 4 from 7 to 6 +move 10 from 4 to 6 +move 5 from 8 to 2 +move 1 from 5 to 9 +move 2 from 2 to 6 +move 2 from 4 to 7 +move 1 from 2 to 7 +move 5 from 9 to 2 +move 1 from 2 to 9 +move 14 from 6 to 8 +move 2 from 8 to 4 +move 1 from 2 to 6 +move 4 from 9 to 3 +move 2 from 6 to 8 +move 5 from 4 to 5 +move 5 from 8 to 3 +move 1 from 2 to 4 +move 3 from 7 to 1 +move 2 from 2 to 7 +move 1 from 4 to 7 +move 1 from 4 to 5 +move 1 from 2 to 8 +move 1 from 4 to 9 +move 8 from 8 to 2 +move 3 from 1 to 5 +move 7 from 2 to 9 +move 8 from 1 to 6 +move 6 from 7 to 2 +move 2 from 2 to 8 +move 5 from 1 to 8 +move 3 from 6 to 8 +move 4 from 3 to 6 +move 3 from 6 to 2 +move 8 from 9 to 2 +move 11 from 5 to 7 +move 12 from 2 to 6 +move 2 from 3 to 7 +move 12 from 7 to 2 +move 10 from 6 to 9 +move 1 from 7 to 1 +move 12 from 8 to 7 +move 2 from 3 to 2 +move 8 from 9 to 7 +move 6 from 2 to 5 +move 1 from 1 to 6 +move 3 from 2 to 6 +move 1 from 3 to 7 +move 5 from 5 to 3 +move 10 from 7 to 2 +move 2 from 3 to 7 +move 8 from 7 to 6 +move 20 from 2 to 8 +move 5 from 8 to 1 +move 5 from 8 to 6 +move 1 from 5 to 7 +move 1 from 1 to 4 +move 4 from 1 to 2 +move 1 from 9 to 6 +move 3 from 3 to 1 +move 4 from 7 to 5 +move 1 from 9 to 8 +move 11 from 8 to 7 +move 1 from 4 to 9 +move 2 from 7 to 5 +move 31 from 6 to 9 +move 4 from 2 to 3 +move 6 from 5 to 1 +move 4 from 1 to 2 +move 7 from 7 to 8 +move 1 from 7 to 6 +move 1 from 1 to 7 +move 24 from 9 to 4 +move 2 from 7 to 8 +move 2 from 9 to 2 +move 2 from 7 to 5 +move 2 from 5 to 9 +move 3 from 4 to 1 +move 20 from 4 to 2 +move 1 from 6 to 1 +move 16 from 2 to 1 +move 4 from 3 to 1 +move 1 from 4 to 8 +move 5 from 8 to 5 +move 5 from 8 to 1 +move 1 from 5 to 2 +move 3 from 5 to 6 +move 33 from 1 to 6 +move 6 from 9 to 4 +move 15 from 6 to 7 +move 6 from 4 to 3 +move 1 from 5 to 3 +move 7 from 3 to 9 +move 11 from 7 to 5 +move 10 from 5 to 8 +move 2 from 7 to 3 +move 5 from 8 to 9 +move 1 from 7 to 5 +move 1 from 5 to 8 +move 1 from 5 to 7 +move 2 from 3 to 8 +move 2 from 7 to 5 +move 2 from 8 to 7 +move 1 from 5 to 9 +move 1 from 7 to 6 +move 3 from 8 to 6 +move 22 from 6 to 9 +move 1 from 7 to 6 +move 27 from 9 to 4 +move 18 from 4 to 8 +move 5 from 4 to 1 +move 1 from 5 to 1 +move 3 from 6 to 3 +move 2 from 3 to 5 +move 2 from 5 to 2 +move 1 from 2 to 6 +move 1 from 6 to 3 +move 9 from 8 to 6 +move 3 from 9 to 8 +move 9 from 6 to 5 +move 1 from 6 to 9 +move 15 from 8 to 5 +move 1 from 3 to 4 +move 6 from 1 to 8 +move 1 from 3 to 7 +move 8 from 5 to 8 +move 2 from 5 to 6 +move 3 from 4 to 6 +move 1 from 7 to 6 +move 2 from 5 to 3 +move 5 from 5 to 1 +move 2 from 3 to 7 +move 1 from 8 to 1 +move 10 from 2 to 9 +move 5 from 6 to 3 +move 7 from 8 to 5 +move 4 from 3 to 5 +move 1 from 2 to 1 +move 2 from 7 to 6 +move 5 from 1 to 5 +move 1 from 3 to 7 +move 1 from 7 to 6 +move 3 from 8 to 5 +move 4 from 6 to 4 +move 1 from 2 to 9 +move 5 from 4 to 6 +move 21 from 5 to 3 +move 2 from 8 to 4 +move 3 from 4 to 1 +move 1 from 8 to 4 +move 18 from 3 to 5 +move 2 from 3 to 6 +move 2 from 6 to 9 +move 2 from 6 to 2 +move 1 from 2 to 9 +move 19 from 9 to 4 +move 3 from 6 to 3 +move 2 from 9 to 4 +move 1 from 1 to 2 +move 1 from 3 to 7 +move 16 from 5 to 2 +move 4 from 1 to 9 +move 3 from 3 to 4 +move 4 from 9 to 8 +move 3 from 5 to 1 +move 22 from 4 to 5 +move 1 from 7 to 2 +move 22 from 5 to 9 +move 2 from 5 to 2 +move 2 from 4 to 6 +move 10 from 9 to 5 +move 1 from 8 to 3 +move 13 from 9 to 2 +move 1 from 6 to 3 +move 19 from 2 to 7 +move 2 from 7 to 4 +move 1 from 8 to 4 +move 1 from 8 to 2 +move 11 from 5 to 7 +move 3 from 1 to 7 +move 8 from 7 to 8 +move 1 from 3 to 5 +move 1 from 8 to 3 +move 1 from 5 to 3 +move 6 from 2 to 3 +move 1 from 8 to 7 +move 1 from 6 to 1 +move 1 from 1 to 8 +move 4 from 8 to 1 +move 1 from 4 to 6 +move 8 from 3 to 9 +move 2 from 2 to 3 +move 3 from 8 to 5 +move 1 from 8 to 2 +move 4 from 2 to 7 +move 5 from 9 to 7 +move 1 from 6 to 3 +move 4 from 2 to 4 +move 23 from 7 to 5 +move 4 from 1 to 2 +move 3 from 9 to 6 +move 2 from 4 to 8 +move 2 from 8 to 3 +move 2 from 6 to 1 +move 1 from 6 to 8 +move 8 from 5 to 3 +move 5 from 2 to 6 +move 5 from 6 to 3 +move 1 from 8 to 3 +move 4 from 4 to 7 +move 15 from 5 to 2 +move 1 from 1 to 9 +move 2 from 5 to 1 +move 4 from 3 to 7 +move 1 from 4 to 9 +move 4 from 7 to 1 +move 2 from 5 to 6 +move 7 from 1 to 2 +move 6 from 2 to 3 +move 16 from 2 to 5 +move 1 from 6 to 3 +move 1 from 6 to 3 +move 9 from 7 to 4 +move 6 from 4 to 6 +move 1 from 9 to 8 +move 23 from 3 to 9 +move 1 from 3 to 4 +move 3 from 4 to 5 +move 9 from 5 to 2 +move 6 from 9 to 7 +move 7 from 7 to 5 +move 5 from 5 to 3 +move 1 from 4 to 6 +move 3 from 3 to 8 +move 6 from 2 to 1 +move 3 from 5 to 6 +move 4 from 7 to 1 +move 2 from 3 to 9 +move 5 from 6 to 8 +move 19 from 9 to 6 +move 1 from 9 to 2 +move 9 from 5 to 9 +move 4 from 8 to 3 +move 5 from 6 to 1 +move 4 from 6 to 1 +move 2 from 3 to 8 +move 17 from 1 to 7 +move 2 from 1 to 2 +move 6 from 6 to 9 +move 4 from 8 to 5 +move 3 from 8 to 2 +move 3 from 5 to 6 +move 4 from 6 to 8 +move 2 from 6 to 9 +move 4 from 8 to 7 +move 9 from 9 to 5 +move 5 from 9 to 4 +move 7 from 2 to 8 +move 1 from 2 to 1 +move 3 from 6 to 5 +move 6 from 8 to 5 +move 1 from 3 to 4 +move 1 from 3 to 1 +move 12 from 7 to 2 +move 5 from 2 to 7 +move 8 from 7 to 5 +move 1 from 9 to 3 +move 5 from 2 to 8 +move 3 from 6 to 3 +move 2 from 2 to 3 +move 1 from 2 to 4 +move 2 from 3 to 4 +move 1 from 1 to 6 +move 14 from 5 to 6 +move 1 from 8 to 6 +move 3 from 3 to 7 +move 4 from 7 to 1 +move 9 from 4 to 3 +move 3 from 1 to 4 +move 1 from 1 to 2 +move 1 from 8 to 4 +move 8 from 3 to 1 +move 1 from 3 to 2 +move 5 from 7 to 6 +move 3 from 1 to 6 +move 2 from 2 to 8 +move 13 from 5 to 3 +move 5 from 1 to 3 +move 3 from 4 to 5 +move 1 from 9 to 2 +move 4 from 3 to 9 +move 1 from 1 to 7 +move 2 from 5 to 8 +move 1 from 7 to 5 +move 2 from 5 to 4 +move 1 from 2 to 6 +move 1 from 4 to 5 +move 7 from 3 to 6 +move 31 from 6 to 1 +move 25 from 1 to 7 +move 2 from 3 to 2 +move 13 from 7 to 9 +move 1 from 1 to 6 +move 1 from 4 to 1 +move 2 from 2 to 9 +move 1 from 4 to 6 +move 3 from 7 to 1 +move 7 from 8 to 3 +move 1 from 8 to 2 +move 1 from 2 to 8 +move 4 from 3 to 4 +move 1 from 8 to 7 +move 3 from 6 to 9 +move 5 from 7 to 6 +move 1 from 4 to 7 +move 5 from 7 to 9 +move 5 from 3 to 6 +move 3 from 4 to 7 +move 1 from 5 to 4 +move 4 from 7 to 9 +move 32 from 9 to 1 +move 1 from 6 to 5 +move 1 from 5 to 9 +move 4 from 3 to 8 +move 5 from 1 to 4 +move 4 from 4 to 9 +move 6 from 1 to 7 +move 4 from 9 to 8 +move 4 from 7 to 8 +move 1 from 7 to 1 +move 1 from 7 to 6 +move 7 from 6 to 3 +move 1 from 9 to 5 +move 2 from 4 to 7 +move 25 from 1 to 6 +move 1 from 7 to 1 +move 1 from 3 to 4 +move 18 from 6 to 8 +move 1 from 5 to 1 +move 3 from 1 to 6 +move 21 from 8 to 3 +move 1 from 8 to 4 +move 2 from 4 to 2 +move 1 from 8 to 1 +move 1 from 7 to 6 +move 5 from 6 to 3 +move 30 from 3 to 1 +move 4 from 8 to 6 +move 1 from 2 to 9 +move 1 from 8 to 5 +move 9 from 6 to 5 +move 2 from 8 to 7 +move 3 from 5 to 9 +move 2 from 3 to 4 +move 1 from 2 to 1 +move 1 from 5 to 8 +move 1 from 8 to 3 +move 2 from 4 to 6 +move 1 from 3 to 1 +move 1 from 5 to 6 +move 5 from 5 to 7 +move 4 from 6 to 8 +move 3 from 8 to 2 +move 1 from 1 to 5 +move 1 from 8 to 7 +move 4 from 9 to 6 +move 1 from 5 to 1 +move 4 from 6 to 8 +move 6 from 7 to 3 +move 4 from 3 to 9 +move 2 from 2 to 7 +move 1 from 3 to 5 +move 3 from 7 to 6 +move 2 from 9 to 8 +move 1 from 2 to 4 +move 1 from 3 to 4 +move 5 from 8 to 4 +move 1 from 9 to 2 +move 1 from 7 to 5 +move 3 from 4 to 5 +move 1 from 9 to 1 +move 1 from 2 to 7 +move 1 from 7 to 1 +move 5 from 5 to 4 +move 4 from 1 to 4 +move 19 from 1 to 9 +move 6 from 6 to 2 +move 12 from 9 to 1 +move 1 from 8 to 6 +move 1 from 9 to 4 +move 4 from 4 to 8 +move 1 from 6 to 5 +move 1 from 5 to 3 +move 2 from 8 to 9 +move 5 from 4 to 6 +move 5 from 9 to 4 +move 1 from 4 to 3 +move 2 from 2 to 9 +move 1 from 6 to 5 +move 1 from 6 to 9 +move 7 from 1 to 5 +move 1 from 3 to 1 +move 2 from 8 to 3 +move 1 from 5 to 7 +move 2 from 9 to 8 diff --git a/2022/05/part1.js b/2022/05/part1.js new file mode 100644 index 0000000..37c24fc --- /dev/null +++ b/2022/05/part1.js @@ -0,0 +1,69 @@ +import * as R from "remeda"; + +import { readFile } from "../03/part1.js"; + +export const sample = readFile("2022", "05", "sample"); +export const puzzleInput = readFile("2022", "05", "input"); + +function parseHeaps(text) { + const lines = text.split("\n").filter(R.identity); + lines.reverse(); + + let [header, ...crates] = lines; + + const stacks = []; + + while (header.trimEnd()) { + header = header.replace(/^(\s+)\d/, (...args) => { + crates = crates.map((c) => c.slice(args[1].length)); + + const stack = []; + + crates = crates.map((l) => + l.replace(/./, (c) => { + if (c !== " ") stack.push(c); + return ""; + }) + ); + + stacks.push(stack); + + return ""; + }); + } + + return stacks; +} + +function parseCommands(text) { + return text + .split("\n") + .filter(R.identity) + .map((line) => line.match(/\d+/g).map((x) => parseInt(x))); +} + +function moveStacks([stacks, commands]) { + for (let [move, from, to] of commands) { + console.log({ move, from, to }); + + while (move-- > 0) { + stacks[to - 1].push(stacks[from - 1].pop()); + } + } + + return stacks; +} + +const spy = (x) => { + console.log(x); + return x; +}; + +export const solutionPart1 = R.createPipe( + (text) => text.split("\n\n"), + ([heaps, commands]) => [parseHeaps(heaps), parseCommands(commands)], + moveStacks, + spy, + R.map((x) => x.pop()), + (x) => x.join("") +); diff --git a/2022/05/part2.js b/2022/05/part2.js new file mode 100644 index 0000000..b509eb0 --- /dev/null +++ b/2022/05/part2.js @@ -0,0 +1 @@ +import * as R from "remeda"; diff --git a/2022/05/puzzle.md b/2022/05/puzzle.md new file mode 100644 index 0000000..241967a --- /dev/null +++ b/2022/05/puzzle.md @@ -0,0 +1,77 @@ +## \--- Day 5: Supply Stacks --- + +The expedition can depart as soon as the final supplies have been unloaded from the ships. Supplies are stored in stacks of marked _crates_, but because the needed supplies are buried under many other crates, the crates need to be rearranged. + +The ship has a _giant cargo crane_ capable of moving crates between stacks. To ensure none of the crates get crushed or fall over, the crane operator will rearrange them in a series of carefully-planned steps. After the crates are rearranged, the desired crates will be at the top of each stack. + +The Elves don't want to interrupt the crane operator during this delicate procedure, but they forgot to ask her _which_ crate will end up where, and they want to be ready to unload them as soon as possible so they can embark. + +They do, however, have a drawing of the starting stacks of crates _and_ the rearrangement procedure (your puzzle input). For example: + +``` + [D] +[N] [C] +[Z] [M] [P] + 1 2 3 + +move 1 from 2 to 1 +move 3 from 1 to 3 +move 2 from 2 to 1 +move 1 from 1 to 2 + +``` + +In this example, there are three stacks of crates. Stack 1 contains two crates: crate `Z` is on the bottom, and crate `N` is on top. Stack 2 contains three crates; from bottom to top, they are crates `M`, `C`, and `D`. Finally, stack 3 contains a single crate, `P`. + +Then, the rearrangement procedure is given. In each step of the procedure, a quantity of crates is moved from one stack to a different stack. In the first step of the above rearrangement procedure, one crate is moved from stack 2 to stack 1, resulting in this configuration: + +``` +[D] +[N] [C] +[Z] [M] [P] + 1 2 3 + +``` + +In the second step, three crates are moved from stack 1 to stack 3. Crates are moved _one at a time_, so the first crate to be moved (`D`) ends up below the second and third crates: + +``` + [Z] + [N] + [C] [D] + [M] [P] + 1 2 3 + +``` + +Then, both crates are moved from stack 2 to stack 1. Again, because crates are moved _one at a time_, crate `C` ends up below crate `M`: + +``` + [Z] + [N] +[M] [D] +[C] [P] + 1 2 3 + +``` + +Finally, one crate is moved from stack 1 to stack 2: + +``` + [Z] + [N] + [D] +[C] [M] [P] + 1 2 3 + +``` + +The Elves just need to know _which crate will end up on top of each stack_; in this example, the top crates are `C` in stack 1, `M` in stack 2, and `Z` in stack 3, so you should combine these together and give the Elves the message `*CMZ*`. + +_After the rearrangement procedure completes, what crate ends up on top of each stack?_ + +To begin, [get your puzzle input](5/input). + +Answer: + +You can also [Shareon [Twitter](https://twitter.com/intent/tweet?text=%22Supply+Stacks%22+%2D+Day+5+%2D+Advent+of+Code+2022&url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F5&related=ericwastl&hashtags=AdventOfCode) [Mastodon]()] this puzzle. diff --git a/2022/05/sample b/2022/05/sample new file mode 100644 index 0000000..42ef47f --- /dev/null +++ b/2022/05/sample @@ -0,0 +1,9 @@ + [D] +[N] [C] +[Z] [M] [P] + 1 2 3 + +move 1 from 2 to 1 +move 3 from 1 to 3 +move 2 from 2 to 1 +move 1 from 1 to 2 diff --git a/2022/05/test.js b/2022/05/test.js new file mode 100644 index 0000000..31df8ed --- /dev/null +++ b/2022/05/test.js @@ -0,0 +1,20 @@ +import { test, expect, describe } from "vitest"; + +import { expectSolution } from "../01/main.js"; +import { solutionPart1, puzzleInput, sample } from "./part1.js"; +import { solutionPart2 } from "./part2.js"; + +describe("part 1", () => { + test("sample", () => { + expect(solutionPart1(sample)).toEqual("CMZ"); + }); + test.only("solution", () => { + expectSolution(solutionPart1(puzzleInput)).toEqual("VPCDMSLWJ"); + }); +}); + +describe("part 2", () => { + test.todo("solution", () => { + expectSolution(solutionPart2(puzzleInput)).toEqual("TODO"); + }); +});