From b3db0b27158ee0821f0e4c3f3888eae6698c00f1 Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Mon, 30 Dec 2024 07:37:37 +0100 Subject: [PATCH] day12 --- day12.py | 86 +++++++++++++++++++++++++++++++++++++++++++++ inputs/input12 | 23 ++++++++++++ inputs/input12_test | 6 ++++ 3 files changed, 115 insertions(+) create mode 100644 day12.py create mode 100644 inputs/input12 create mode 100644 inputs/input12_test diff --git a/day12.py b/day12.py new file mode 100644 index 0000000..46d3ac7 --- /dev/null +++ b/day12.py @@ -0,0 +1,86 @@ +from enum import Enum +from tools.aoc import AOCDay +from typing import Any + + +class Command(str, Enum): + COPY = "cpy" + INCREASE = "inc" + DECREASE = "dec" + JUMP_NON_ZERO = "jnz" + + +class Computer: + def __init__( + self, code: list[tuple[Command, str | int, ...]], reg_a: int = 0, reg_b: int = 0, reg_c: int = 0, reg_d: int = 0 + ): + self.reg = { + "a": reg_a, + "b": reg_b, + "c": reg_c, + "d": reg_d, + } + self.code = code + self.instr_ptr = 0 + + def run(self): + while self.instr_ptr < len(self.code): + cmd, *args = self.code[self.instr_ptr] + if cmd == Command.COPY: + if isinstance(args[0], int): + self.reg[args[1]] = args[0] + else: + self.reg[args[1]] = self.reg[args[0]] + self.instr_ptr += 1 + elif cmd == Command.INCREASE: + self.reg[args[0]] += 1 + self.instr_ptr += 1 + elif cmd == Command.DECREASE: + self.reg[args[0]] -= 1 + self.instr_ptr += 1 + elif cmd == Command.JUMP_NON_ZERO: + if isinstance(args[0], int): + check = args[0] + else: + check = self.reg[args[0]] + if check: + self.instr_ptr += args[1] + else: + self.instr_ptr += 1 + + +class Day(AOCDay): + inputs = [ + [ + (42, "input12_test"), + (318083, "input12"), + ], + [ + (9227737, "input12"), + ], + ] + + def parse_input(self) -> list[tuple[Command, str | int, ...]]: + code = [] + for line in self.getInput(): + args = line.split() + cmd = Command(args[0]) + args = [int(arg) if arg not in "abcd" else arg for arg in args[1:]] + code.append((cmd, *args)) + + return code + + def part1(self) -> Any: + computer = Computer(code=self.parse_input()) + computer.run() + return computer.reg["a"] + + def part2(self) -> Any: + computer = Computer(code=self.parse_input(), reg_c=1) + computer.run() + return computer.reg["a"] + + +if __name__ == "__main__": + day = Day(2016, 12) + day.run(verbose=True) diff --git a/inputs/input12 b/inputs/input12 new file mode 100644 index 0000000..e4a634f --- /dev/null +++ b/inputs/input12 @@ -0,0 +1,23 @@ +cpy 1 a +cpy 1 b +cpy 26 d +jnz c 2 +jnz 1 5 +cpy 7 c +inc d +dec c +jnz c -2 +cpy a c +inc a +dec b +jnz b -2 +cpy c b +dec d +jnz d -6 +cpy 16 c +cpy 17 d +inc a +dec d +jnz d -2 +dec c +jnz c -5 diff --git a/inputs/input12_test b/inputs/input12_test new file mode 100644 index 0000000..2722ca0 --- /dev/null +++ b/inputs/input12_test @@ -0,0 +1,6 @@ +cpy 41 a +inc a +inc a +dec a +jnz a 2 +dec a \ No newline at end of file