From 30f4a0b942bdee7e336c05f6667e74ca07370ee9 Mon Sep 17 00:00:00 2001 From: Daniel Weber Date: Tue, 17 Dec 2024 17:32:01 -0500 Subject: [PATCH] Still not done :( --- 2024/day17/main.py | 151 +++++++++++++++++++++++---------------------- 1 file changed, 77 insertions(+), 74 deletions(-) diff --git a/2024/day17/main.py b/2024/day17/main.py index 42bd541..77dc642 100644 --- a/2024/day17/main.py +++ b/2024/day17/main.py @@ -7,99 +7,102 @@ from warnings import showwarning sys.path.insert(1, os.path.abspath('../../')) from python_tools.aoc_utils import * +def run_program(r, p): + pc = 0 + out = 0 + while True: + operands = [0,1,2,3,r["A"],r["B"],r["C"], 7] + co = operands[p[pc+1]] + lo = p[pc+1] + match p[pc]: + case 0: + r["A"] = r["A"] >> co + pc += 2 + case 1: + r["B"] = r["B"] ^ lo + pc += 2 + case 2: + r["B"] = co % 8 + pc += 2 + case 3: + if r["A"] == 0: + pc += 2 + else: + pc = lo + return out, pc + case 4: + r["B"] = r["B"] ^ r["C"] + pc += 2 + case 5: + out = int(co % 8) + pc += 2 + case 6: + r["B"] = r["A"] >> co + pc += 2 + case 7: + r["C"] = r["A"] >> co + pc += 2 + + def part_one(registers, program): pc = 0 out = [] looping = True - last_state = 0 - current_state = [registers, program, pc] while looping: - if pc > len(program)-1 or current_state == last_state: + if pc > len(program)-1: looping = False break else: - operands = [0,1,2,3,registers["A"],registers["B"],registers["C"], 7] - co = operands[program[pc+1]] - lo = program[pc+1] - - match program[pc]: - case 0: - registers["A"] = registers["A"] >> co - pc += 2 - case 1: - registers["B"] = registers["B"] ^ lo - pc += 2 - case 2: - registers["B"] = co % 8 - pc += 2 - case 3: - if registers["A"] == 0: - pc += 2 - else: - pc = lo - case 4: - registers["B"] = registers["B"] ^ registers["C"] - pc += 2 - case 5: - out.append(int(co % 8)) - pc += 2 - case 6: - registers["B"] = registers["A"] >> co - pc += 2 - case 7: - registers["C"] = registers["A"] >> co - pc += 2 + o, pc = run_program(registers, program) + out.append(o) print("P1: ", str(out).strip('[]').replace(" ", "")) + return out def part_two(r, p): pc = 0 - out = [] + A = 0 looping = True - last_state = 0 - current_state = [registers, program, pc] - while looping: - if pc > len(program)-1 or current_state == last_state: - looping = False - break - else: - operands = [0,1,2,3,registers["A"],registers["B"],registers["C"], 7] - co = operands[program[pc+1]] - lo = program[pc+1] + p_copy = p.copy() + p_copy.reverse() + R = {"A": 0, "B": 0, "C": 0} + for count, op in enumerate(p_copy): + i = 0 + while True: + # print(A) + out = [] + r = copy.deepcopy(R) + r["A"] = A+i + # out = part_one(r, p) + o = -1 + pc = 0 - match program[pc]: - case 0: - registers["A"] = registers["A"] >> co - pc += 2 - case 1: - registers["B"] = registers["B"] ^ lo - pc += 2 - case 2: - registers["B"] = co % 8 - pc += 2 - case 3: - if registers["A"] == 0: - pc += 2 - else: - pc = lo - case 4: - registers["B"] = registers["B"] ^ registers["C"] - pc += 2 - case 5: - out.append(int(co % 8)) - pc += 2 - case 6: - registers["B"] = registers["A"] >> co - pc += 2 - case 7: - registers["C"] = registers["A"] >> co - pc += 2 - print("P2: ", count) + while pc == 0: + o, pc = run_program(r, p) + out.append(o) + # print(o) + # if c > 0 and o != p[-(count-c)]: + # failed = True + # break + # c+=1 + # if not failed: + if out == p[:count+1]: + print(out) + A = (A+i)<<3 + break + i+=1 + # else: + # A += 1 + A = A>>3 + + R["A"]=A + print("P2: ", A, R["A"], out) + part_one(R, p) def main(): program = [] registers = {} pos = [0,0] - contents = file2list("input.txt") + contents = file2list("test.txt") for row, i in enumerate(contents): if "Register" in i: a = i.split(":")