From 6b733982f9f240c1c97f1fa705bfbe4cd93c640e Mon Sep 17 00:00:00 2001 From: mhsn Date: Fri, 12 Sep 2025 20:20:58 +0100 Subject: simplify python file structure --- 2024/17/python.py | 68 +++++++++++++++++++++++++++++++++++++++++++ 2024/17/python/main.py | 66 ----------------------------------------- 2024/17/python/pyproject.toml | 6 ---- 3 files changed, 68 insertions(+), 72 deletions(-) create mode 100755 2024/17/python.py delete mode 100644 2024/17/python/main.py delete mode 100644 2024/17/python/pyproject.toml (limited to '2024/17') diff --git a/2024/17/python.py b/2024/17/python.py new file mode 100755 index 0000000..9ea7de4 --- /dev/null +++ b/2024/17/python.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 + +from fileinput import input +from itertools import takewhile, zip_longest + +inp = map(str.strip, input()) +regs = [int(r[2]) for r in (line.split() for line in takewhile(bool, inp))] +prog = [int(o) for o in next(inp).split()[1].split(",")] +out = [] + + +def run(prog, ra, rb, rc): + out = [] + ir = 0 + while ir < len(prog): + instr, op = prog[ir], prog[ir + 1] + combo = {4: ra, 5: rb, 6: rc} + cop = combo.get(op, op) + match instr: + case 0: + ra = ra >> cop + case 1: + rb ^= op + case 2: + rb = cop & 0b111 + case 3 if ra: + ir = op - 2 + case 4: + rb ^= rc + case 5: + yield cop & 0b111 + case 6: + rb = ra >> cop + case 7: + rc = ra >> cop + ir += 2 + return out + + +def match(prog, ra): + return ( + got == want + for got, want in zip_longest( + reversed(list(run(prog, ra, 0, 0))), + reversed(prog), + ) + ) + + +def find_a(prog): + q = list(range(8)) + while True: + curr = q.pop(0) + if all(match(prog, curr)): + return curr + + best = sum(match(prog, curr)) + for n in range(8): + ra = (curr << 3) + n + if sum(match(prog, ra)) > best: + q.append(ra) + + +silver = ",".join(map(str, run(prog, *regs))) +gold = find_a(prog) + +print("silver:", silver) +print("gold:", gold) diff --git a/2024/17/python/main.py b/2024/17/python/main.py deleted file mode 100644 index a441d40..0000000 --- a/2024/17/python/main.py +++ /dev/null @@ -1,66 +0,0 @@ -from fileinput import input -from itertools import takewhile, zip_longest - -inp = map(str.strip, input()) -regs = [int(r[2]) for r in (line.split() for line in takewhile(bool, inp))] -prog = [int(o) for o in next(inp).split()[1].split(",")] -out = [] - - -def run(prog, ra, rb, rc): - out = [] - ir = 0 - while ir < len(prog): - instr, op = prog[ir], prog[ir + 1] - combo = {4: ra, 5: rb, 6: rc} - cop = combo.get(op, op) - match instr: - case 0: - ra = ra >> cop - case 1: - rb ^= op - case 2: - rb = cop & 0b111 - case 3 if ra: - ir = op - 2 - case 4: - rb ^= rc - case 5: - yield cop & 0b111 - case 6: - rb = ra >> cop - case 7: - rc = ra >> cop - ir += 2 - return out - - -def match(prog, ra): - return ( - got == want - for got, want in zip_longest( - reversed(list(run(prog, ra, 0, 0))), - reversed(prog), - ) - ) - - -def find_a(prog): - q = list(range(8)) - while True: - curr = q.pop(0) - if all(match(prog, curr)): - return curr - - best = sum(match(prog, curr)) - for n in range(8): - ra = (curr << 3) + n - if sum(match(prog, ra)) > best: - q.append(ra) - - -silver = ",".join(map(str, run(prog, *regs))) -gold = find_a(prog) - -print("silver:", silver) -print("gold:", gold) diff --git a/2024/17/python/pyproject.toml b/2024/17/python/pyproject.toml deleted file mode 100644 index daf149a..0000000 --- a/2024/17/python/pyproject.toml +++ /dev/null @@ -1,6 +0,0 @@ -[project] -name = "aoc-2024-17" -version = "0.1.0" -description = "advent of code 2024-17" -requires-python = ">=3.13" -dependencies = [] -- cgit v1.2.3