From b4971e50a33672a21f63f7886f514e4e4ae832bb Mon Sep 17 00:00:00 2001 From: Lennart ten Wolde Date: Sun, 18 Dec 2022 01:22:53 +0100 Subject: [PATCH] Day 5 --- day_05/input.txt | 512 +++++++++++++++++++++++++++++++++++++++++++++++ day_05/solve.nim | 75 +++++++ 2 files changed, 587 insertions(+) create mode 100644 day_05/input.txt create mode 100644 day_05/solve.nim diff --git a/day_05/input.txt b/day_05/input.txt new file mode 100644 index 0000000..10b0453 --- /dev/null +++ b/day_05/input.txt @@ -0,0 +1,512 @@ + [F] [Q] [Q] +[B] [Q] [V] [D] [S] +[S] [P] [T] [R] [M] [D] +[J] [V] [W] [M] [F] [J] [J] +[Z] [G] [S] [W] [N] [D] [R] [T] +[V] [M] [B] [G] [S] [C] [T] [V] [S] +[D] [S] [L] [J] [L] [G] [G] [F] [R] +[G] [Z] [C] [H] [C] [R] [H] [P] [D] + 1 2 3 4 5 6 7 8 9 + +move 3 from 5 to 2 +move 3 from 8 to 4 +move 7 from 7 to 3 +move 14 from 3 to 9 +move 8 from 4 to 1 +move 1 from 7 to 5 +move 2 from 6 to 4 +move 4 from 5 to 7 +move 1 from 3 to 6 +move 3 from 4 to 3 +move 1 from 4 to 1 +move 5 from 1 to 9 +move 1 from 4 to 6 +move 4 from 7 to 4 +move 15 from 9 to 2 +move 7 from 1 to 6 +move 3 from 3 to 5 +move 1 from 4 to 9 +move 2 from 5 to 3 +move 2 from 4 to 9 +move 4 from 1 to 6 +move 1 from 3 to 1 +move 1 from 3 to 2 +move 4 from 6 to 3 +move 24 from 2 to 8 +move 4 from 9 to 8 +move 1 from 1 to 3 +move 2 from 5 to 4 +move 1 from 2 to 4 +move 19 from 8 to 1 +move 5 from 3 to 9 +move 8 from 1 to 3 +move 3 from 4 to 1 +move 6 from 9 to 5 +move 2 from 3 to 4 +move 1 from 8 to 5 +move 2 from 4 to 6 +move 11 from 6 to 1 +move 8 from 8 to 7 +move 1 from 6 to 5 +move 13 from 1 to 3 +move 1 from 1 to 7 +move 2 from 7 to 8 +move 5 from 7 to 1 +move 2 from 8 to 4 +move 3 from 5 to 3 +move 11 from 3 to 1 +move 2 from 5 to 3 +move 2 from 5 to 3 +move 2 from 7 to 1 +move 7 from 3 to 1 +move 1 from 4 to 5 +move 1 from 6 to 4 +move 3 from 4 to 7 +move 3 from 7 to 1 +move 6 from 3 to 5 +move 1 from 5 to 9 +move 4 from 5 to 4 +move 2 from 3 to 4 +move 8 from 9 to 2 +move 5 from 4 to 6 +move 1 from 6 to 5 +move 1 from 4 to 9 +move 39 from 1 to 7 +move 7 from 2 to 6 +move 1 from 9 to 3 +move 1 from 2 to 7 +move 1 from 3 to 1 +move 5 from 7 to 3 +move 4 from 5 to 1 +move 19 from 7 to 9 +move 1 from 9 to 8 +move 1 from 9 to 7 +move 5 from 9 to 3 +move 6 from 6 to 7 +move 1 from 8 to 3 +move 4 from 1 to 4 +move 23 from 7 to 6 +move 1 from 1 to 6 +move 21 from 6 to 2 +move 3 from 4 to 8 +move 7 from 6 to 1 +move 1 from 4 to 9 +move 1 from 6 to 7 +move 6 from 1 to 2 +move 1 from 7 to 4 +move 15 from 2 to 8 +move 5 from 3 to 8 +move 22 from 8 to 7 +move 1 from 8 to 1 +move 5 from 3 to 4 +move 1 from 3 to 2 +move 1 from 1 to 2 +move 3 from 4 to 8 +move 3 from 8 to 9 +move 11 from 2 to 1 +move 2 from 1 to 4 +move 15 from 9 to 5 +move 22 from 7 to 3 +move 2 from 4 to 9 +move 3 from 4 to 2 +move 8 from 1 to 8 +move 6 from 8 to 6 +move 1 from 6 to 2 +move 3 from 6 to 9 +move 3 from 2 to 7 +move 4 from 2 to 9 +move 2 from 7 to 5 +move 1 from 1 to 7 +move 2 from 8 to 2 +move 2 from 7 to 5 +move 9 from 5 to 3 +move 8 from 5 to 2 +move 1 from 6 to 4 +move 1 from 6 to 9 +move 1 from 2 to 9 +move 2 from 5 to 1 +move 7 from 2 to 3 +move 1 from 4 to 3 +move 1 from 2 to 4 +move 5 from 3 to 4 +move 6 from 9 to 3 +move 1 from 2 to 6 +move 6 from 9 to 6 +move 2 from 1 to 8 +move 3 from 6 to 3 +move 2 from 8 to 6 +move 6 from 4 to 1 +move 14 from 3 to 9 +move 1 from 6 to 4 +move 3 from 3 to 9 +move 1 from 4 to 5 +move 10 from 9 to 6 +move 6 from 6 to 7 +move 2 from 1 to 8 +move 1 from 8 to 6 +move 16 from 3 to 2 +move 1 from 8 to 1 +move 1 from 7 to 1 +move 7 from 3 to 4 +move 1 from 6 to 5 +move 4 from 2 to 3 +move 5 from 4 to 9 +move 2 from 4 to 5 +move 4 from 7 to 4 +move 5 from 9 to 6 +move 2 from 5 to 4 +move 11 from 6 to 7 +move 1 from 6 to 8 +move 5 from 1 to 5 +move 2 from 6 to 4 +move 7 from 7 to 3 +move 1 from 8 to 6 +move 2 from 7 to 3 +move 1 from 1 to 3 +move 3 from 2 to 8 +move 9 from 2 to 5 +move 1 from 6 to 1 +move 1 from 4 to 8 +move 7 from 4 to 7 +move 8 from 5 to 6 +move 1 from 7 to 2 +move 1 from 7 to 4 +move 3 from 7 to 8 +move 1 from 2 to 3 +move 1 from 1 to 2 +move 1 from 1 to 7 +move 3 from 7 to 6 +move 11 from 6 to 2 +move 4 from 8 to 7 +move 2 from 8 to 7 +move 15 from 3 to 2 +move 7 from 9 to 4 +move 3 from 3 to 2 +move 4 from 4 to 7 +move 5 from 7 to 3 +move 3 from 4 to 6 +move 3 from 6 to 9 +move 1 from 4 to 2 +move 1 from 8 to 1 +move 2 from 3 to 7 +move 2 from 3 to 7 +move 23 from 2 to 5 +move 1 from 9 to 1 +move 1 from 7 to 9 +move 1 from 1 to 8 +move 8 from 7 to 1 +move 1 from 8 to 4 +move 1 from 4 to 2 +move 3 from 9 to 8 +move 1 from 7 to 9 +move 22 from 5 to 9 +move 1 from 8 to 5 +move 1 from 7 to 4 +move 1 from 4 to 5 +move 1 from 8 to 3 +move 2 from 9 to 3 +move 5 from 5 to 2 +move 5 from 5 to 4 +move 3 from 2 to 7 +move 1 from 7 to 3 +move 6 from 1 to 7 +move 4 from 3 to 1 +move 6 from 2 to 8 +move 1 from 5 to 6 +move 2 from 8 to 1 +move 12 from 9 to 4 +move 8 from 9 to 4 +move 1 from 2 to 9 +move 2 from 9 to 8 +move 3 from 2 to 8 +move 5 from 8 to 6 +move 7 from 7 to 1 +move 4 from 8 to 9 +move 1 from 6 to 1 +move 17 from 4 to 7 +move 1 from 2 to 4 +move 2 from 4 to 1 +move 6 from 4 to 6 +move 1 from 1 to 4 +move 7 from 1 to 5 +move 9 from 7 to 9 +move 8 from 9 to 8 +move 5 from 8 to 3 +move 1 from 5 to 6 +move 2 from 3 to 6 +move 1 from 9 to 1 +move 1 from 6 to 1 +move 10 from 6 to 1 +move 1 from 5 to 1 +move 2 from 9 to 1 +move 1 from 9 to 7 +move 2 from 6 to 8 +move 2 from 8 to 2 +move 1 from 6 to 8 +move 22 from 1 to 9 +move 9 from 7 to 5 +move 1 from 8 to 1 +move 2 from 8 to 3 +move 4 from 5 to 9 +move 1 from 8 to 3 +move 5 from 1 to 9 +move 2 from 7 to 3 +move 2 from 4 to 7 +move 1 from 8 to 5 +move 2 from 2 to 4 +move 1 from 5 to 8 +move 9 from 5 to 8 +move 2 from 7 to 5 +move 2 from 4 to 5 +move 3 from 8 to 4 +move 3 from 4 to 3 +move 2 from 8 to 6 +move 1 from 6 to 4 +move 3 from 5 to 9 +move 1 from 6 to 3 +move 12 from 3 to 5 +move 1 from 3 to 1 +move 7 from 5 to 4 +move 1 from 1 to 3 +move 1 from 8 to 1 +move 7 from 5 to 1 +move 6 from 9 to 6 +move 29 from 9 to 5 +move 2 from 4 to 6 +move 26 from 5 to 2 +move 24 from 2 to 7 +move 1 from 3 to 2 +move 8 from 1 to 7 +move 7 from 6 to 9 +move 2 from 5 to 3 +move 1 from 6 to 4 +move 3 from 8 to 5 +move 2 from 3 to 8 +move 2 from 2 to 8 +move 5 from 9 to 2 +move 27 from 7 to 2 +move 2 from 8 to 3 +move 2 from 9 to 5 +move 3 from 8 to 5 +move 2 from 7 to 4 +move 3 from 4 to 7 +move 2 from 3 to 2 +move 4 from 5 to 1 +move 5 from 7 to 2 +move 29 from 2 to 8 +move 9 from 8 to 3 +move 2 from 4 to 8 +move 7 from 3 to 2 +move 3 from 5 to 4 +move 1 from 7 to 5 +move 3 from 5 to 6 +move 2 from 1 to 8 +move 2 from 6 to 8 +move 3 from 4 to 2 +move 4 from 4 to 2 +move 1 from 6 to 8 +move 8 from 2 to 4 +move 2 from 3 to 5 +move 1 from 4 to 1 +move 3 from 1 to 2 +move 4 from 8 to 2 +move 3 from 4 to 9 +move 3 from 4 to 1 +move 2 from 9 to 5 +move 1 from 4 to 6 +move 4 from 5 to 1 +move 1 from 6 to 8 +move 1 from 9 to 3 +move 4 from 2 to 3 +move 15 from 8 to 2 +move 9 from 8 to 1 +move 1 from 3 to 9 +move 5 from 1 to 9 +move 3 from 9 to 7 +move 2 from 7 to 6 +move 3 from 3 to 2 +move 1 from 7 to 8 +move 1 from 9 to 6 +move 1 from 9 to 8 +move 2 from 8 to 2 +move 1 from 1 to 2 +move 1 from 3 to 7 +move 4 from 1 to 7 +move 19 from 2 to 5 +move 1 from 1 to 4 +move 1 from 7 to 4 +move 1 from 1 to 5 +move 3 from 1 to 4 +move 1 from 1 to 8 +move 6 from 2 to 4 +move 7 from 2 to 1 +move 2 from 7 to 9 +move 8 from 2 to 8 +move 2 from 7 to 3 +move 1 from 6 to 4 +move 10 from 4 to 6 +move 5 from 6 to 7 +move 2 from 9 to 8 +move 6 from 8 to 9 +move 1 from 2 to 3 +move 2 from 8 to 3 +move 5 from 1 to 8 +move 8 from 5 to 2 +move 8 from 8 to 7 +move 7 from 2 to 8 +move 1 from 1 to 2 +move 1 from 9 to 7 +move 1 from 4 to 2 +move 2 from 2 to 6 +move 5 from 9 to 3 +move 2 from 8 to 6 +move 2 from 3 to 9 +move 4 from 8 to 6 +move 7 from 6 to 1 +move 8 from 1 to 5 +move 1 from 8 to 7 +move 1 from 9 to 6 +move 12 from 5 to 3 +move 1 from 4 to 8 +move 2 from 9 to 5 +move 1 from 2 to 3 +move 3 from 5 to 1 +move 1 from 1 to 5 +move 21 from 3 to 8 +move 2 from 1 to 5 +move 6 from 5 to 7 +move 2 from 5 to 6 +move 10 from 6 to 9 +move 1 from 6 to 8 +move 13 from 8 to 2 +move 2 from 5 to 4 +move 2 from 4 to 3 +move 4 from 9 to 1 +move 5 from 7 to 8 +move 12 from 8 to 1 +move 5 from 9 to 6 +move 1 from 3 to 7 +move 2 from 6 to 5 +move 11 from 2 to 1 +move 1 from 8 to 4 +move 16 from 1 to 9 +move 1 from 2 to 6 +move 1 from 8 to 5 +move 12 from 9 to 3 +move 14 from 7 to 2 +move 1 from 7 to 9 +move 1 from 4 to 2 +move 1 from 7 to 5 +move 3 from 9 to 5 +move 4 from 6 to 9 +move 3 from 9 to 4 +move 1 from 8 to 4 +move 2 from 4 to 5 +move 1 from 7 to 1 +move 5 from 3 to 5 +move 2 from 4 to 2 +move 8 from 2 to 7 +move 7 from 2 to 4 +move 1 from 3 to 7 +move 3 from 9 to 7 +move 2 from 2 to 9 +move 3 from 4 to 5 +move 6 from 1 to 8 +move 6 from 1 to 5 +move 3 from 9 to 2 +move 22 from 5 to 9 +move 1 from 5 to 6 +move 2 from 2 to 3 +move 5 from 7 to 6 +move 5 from 8 to 9 +move 2 from 7 to 2 +move 20 from 9 to 4 +move 1 from 8 to 3 +move 2 from 2 to 5 +move 1 from 2 to 5 +move 15 from 4 to 8 +move 1 from 5 to 7 +move 6 from 9 to 1 +move 5 from 4 to 8 +move 2 from 4 to 8 +move 1 from 2 to 1 +move 5 from 6 to 5 +move 5 from 5 to 7 +move 1 from 9 to 8 +move 5 from 7 to 2 +move 2 from 5 to 1 +move 4 from 7 to 5 +move 1 from 5 to 9 +move 1 from 6 to 8 +move 1 from 7 to 2 +move 6 from 3 to 4 +move 3 from 5 to 7 +move 1 from 9 to 2 +move 6 from 2 to 3 +move 1 from 3 to 4 +move 13 from 8 to 9 +move 7 from 1 to 5 +move 6 from 9 to 2 +move 1 from 1 to 4 +move 6 from 2 to 3 +move 1 from 1 to 4 +move 5 from 9 to 7 +move 11 from 8 to 4 +move 7 from 7 to 3 +move 2 from 7 to 8 +move 1 from 8 to 2 +move 8 from 4 to 1 +move 2 from 1 to 6 +move 2 from 5 to 8 +move 3 from 1 to 9 +move 1 from 8 to 2 +move 11 from 3 to 2 +move 2 from 8 to 9 +move 9 from 4 to 7 +move 11 from 3 to 8 +move 7 from 9 to 6 +move 5 from 4 to 6 +move 3 from 7 to 3 +move 1 from 7 to 1 +move 5 from 7 to 6 +move 2 from 3 to 5 +move 1 from 3 to 4 +move 5 from 2 to 5 +move 1 from 1 to 7 +move 1 from 4 to 8 +move 1 from 7 to 6 +move 7 from 5 to 7 +move 2 from 5 to 7 +move 3 from 1 to 7 +move 1 from 2 to 3 +move 1 from 6 to 4 +move 1 from 3 to 4 +move 1 from 5 to 3 +move 18 from 6 to 4 +move 9 from 7 to 1 +move 14 from 4 to 6 +move 3 from 6 to 4 +move 12 from 6 to 7 +move 2 from 5 to 3 +move 3 from 7 to 4 +move 6 from 4 to 7 +move 5 from 1 to 7 +move 5 from 4 to 5 +move 5 from 2 to 1 +move 9 from 8 to 4 +move 9 from 1 to 3 +move 2 from 8 to 2 +move 4 from 2 to 4 +move 1 from 7 to 6 +move 1 from 2 to 3 +move 1 from 8 to 9 +move 1 from 6 to 9 +move 2 from 9 to 3 +move 3 from 4 to 1 +move 13 from 3 to 5 +move 12 from 5 to 1 +move 7 from 1 to 8 +move 1 from 3 to 6 +move 4 from 5 to 4 +move 1 from 5 to 2 +move 8 from 4 to 9 \ No newline at end of file diff --git a/day_05/solve.nim b/day_05/solve.nim new file mode 100644 index 0000000..cf28612 --- /dev/null +++ b/day_05/solve.nim @@ -0,0 +1,75 @@ +import std/[strutils, sequtils, strformat, sugar] + +let input = readFile("day_05/input.txt") + +type Stacks = seq[seq[char]] + +proc readStacks(data: string): Stacks = + let lines = data.splitLines() + let count = lines[lines.len - 1].split(" ").len + var stacks = newSeqWith[char](count, newSeq[char]()) + for line in 0..lines.len-2: + for stack in 0..count-1: + let crate = lines[line][stack*4..stack*4+2] + if not crate.isEmptyOrWhitespace: + stacks[stack].insert(lines[line][stack*4+1..stack*4+1]) + return stacks + +#region debug-only +proc echoStacks(stacks: Stacks) = + var height = stacks.mapIt(it.len).max() + while height > 0: + height -= 1 + var line = "" + for i in 0..stacks.len-1: + if height < stacks[i].len: + # let item = stacks[i][height] + line.add fmt"[{stacks[i][height]}] " + else: + line.add fmt" " + echo line + var line = "" + for i in 0..stacks.len-1: + line.add fmt" {i+1} " + echo line +#endregion debug-only + +proc moveCrate(stacks: var Stacks, operation: string, preserveOrder: bool = false) = + let tokens = operation.split(" ") + assert tokens[0] == "move" + let amount = tokens[1].parseInt + assert tokens[2] == "from" + let fromStack = tokens[3].parseInt - 1 + assert tokens[4] == "to" + let toStack = tokens[5].parseInt - 1 + + if preserveOrder: + var moving = (0..amount-1).toSeq.mapIt(stacks[fromStack].pop) + for crate in 0..amount-1: + stacks[toStack].add(moving.pop) + return + + for i in 0..amount-1: + stacks[toStack].add(stacks[fromStack].pop) + +proc solvePart1() = + let inputData = input.split("\n\n") + var stacks = readStacks(inputData[0]) + for operation in inputData[1].splitLines: + stacks.moveCrate(operation) + + stacks.echoStacks + echo stacks.mapIt(it[it.len - 1]).foldl(a & b, "") + +proc solvePart2() = + let inputData = input.split("\n\n") + var stacks = readStacks(inputData[0]) + for operation in inputData[1].splitLines: + stacks.moveCrate(operation, true) + + stacks.echoStacks + echo stacks.mapIt(it[it.len - 1]).foldl(a & b, "") + +if isMainModule: + solvePart1() + solvePart2()