From 927feb071e35f524dd0b0ae35250108817029f4e Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Wed, 18 Dec 2024 14:32:38 +0100 Subject: [PATCH] started day 17 puzzle 2 --- res/examples/{day17.txt => day17_1.txt} | 0 res/examples/day17_2.txt | 5 ++ src/day17/puzzle1.typ | 4 +- src/day17/puzzle2.typ | 108 ++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 1 deletion(-) rename res/examples/{day17.txt => day17_1.txt} (100%) create mode 100644 res/examples/day17_2.txt diff --git a/res/examples/day17.txt b/res/examples/day17_1.txt similarity index 100% rename from res/examples/day17.txt rename to res/examples/day17_1.txt diff --git a/res/examples/day17_2.txt b/res/examples/day17_2.txt new file mode 100644 index 0000000..2ed9dda --- /dev/null +++ b/res/examples/day17_2.txt @@ -0,0 +1,5 @@ +Register A: 2024 +Register B: 0 +Register C: 0 + +Program: 0,3,5,4,3,0 \ No newline at end of file diff --git a/src/day17/puzzle1.typ b/src/day17/puzzle1.typ index 6cda181..00dbd9b 100644 --- a/src/day17/puzzle1.typ +++ b/src/day17/puzzle1.typ @@ -81,5 +81,7 @@ #show-puzzle( 17, 1, solve, - example: "4,6,3,5,6,3,5,2,1,0" + example: ( + "1": "4,6,3,5,6,3,5,2,1,0" + ) ) \ No newline at end of file diff --git a/src/day17/puzzle2.typ b/src/day17/puzzle2.typ index e69de29..abe8599 100644 --- a/src/day17/puzzle2.typ +++ b/src/day17/puzzle2.typ @@ -0,0 +1,108 @@ +#import "/src/utils.typ": * + +#let ADV = 0 +#let BXL = 1 +#let BST = 2 +#let JNZ = 3 +#let BXC = 4 +#let OUT = 5 +#let BDV = 6 +#let CDV = 7 + +#let ops = ("ADV", "BXL", "BST", "JNZ", "BXC", "OUT", "BDV", "CDV") + +#let get-combo(regs, value) = { + if value >= 7 { + panic() + } + if value <= 3 { + return value + } + return regs.at(value - 4) +} + +#let describe-combo(value) = { + if value == 7 { + return "" + } + if value <= 3 { + return str(value) + } + return "ABC".at(value - 4) +} + +#let describe(program) = { + let res = "" + res += program.map(str).join(",") + + for i in range(0, program.len(), step: 2) { + res += "\n" + let op = program.at(i) + let val = program.at(i + 1) + let combo = describe-combo(val) + + res += ops.at(op) + ": " + if op == ADV { + res += "A >>= " + combo + } else if op == BXL { + res += "B ^= " + str(val) + } else if op == BST { + res += "B = " + combo + " & 0b111" + } else if op == JNZ { + res += "IF A != 0 {PC = " + str(val) + "}" + } else if op == BXC { + res += "B ^= C" + } else if op == OUT { + res += "OUT(" + combo + " & 0b111)" + } else if op == BDV { + res += "B = A >> " + combo + } else if op == CDV { + res += "C = A >> " + combo + } + } + return res +} + +#let solve(input) = { + let (registers, program) = input.split("\n\n") + + let regs = () + for line in registers.split("\n") { + regs.push( + int( + line.split(": ") + .last() + ) + ) + } + program = program.split(": ") + .last() + .split(",") + .map(int) + + let out = () + let pc = 0 + + regs.first() = 0 + + for n in program { + let b = n + } + + return raw(block: true, describe(program)) +} + +Example: +#solve(read(get-example-path(17, suffix: "2"))) + +Input: +#solve(get-input(17)) + +/* +#show-puzzle( + 17, 2, + solve, + example: ( + "2": 117440 + ) +)*/ \ No newline at end of file