Skip to content

Commit fcb85d7

Browse files
committed
2024 Day 17 Part 2 Completed
1 parent 0b1bfd5 commit fcb85d7

2 files changed

Lines changed: 73 additions & 10 deletions

File tree

2024/17/daily.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ def run_program(registers, program):
6565
ip += 1
6666
# The bst instruction (opcode 2) calculates the value of its combo operand modulo 8
6767
elif op == 2:
68-
# TODO this would be faster if we just grabbed the 3 lowest bits instead
69-
registers['B'] = get_combo(program[ip], registers) % 8
68+
registers['B'] = get_combo(program[ip], registers) & 7
7069
ip += 1
7170
# The jnz instruction (opcode 3) does nothing if the A register is 0.
7271
# However, if the A register is not zero, it jumps by setting the instruction pointer
@@ -86,18 +85,47 @@ def run_program(registers, program):
8685
# The out instruction (opcode 5) calculates the value of its combo operand modulo 8,
8786
# then outputs that value.
8887
elif op == 5:
89-
output.append(get_combo(program[ip], registers) % 8)
88+
output.append(get_combo(program[ip], registers) & 7)
9089
ip += 1
9190

9291
return registers, output
9392

93+
def quinify_slow(registers, program):
94+
# iterate from registers['a'] in increments of 8
95+
for i in range(registers['A'], 1000000000, 8):
96+
registers['A'] = i
97+
_, output = run_program(registers, program)
98+
if output == program:
99+
return i
100+
101+
return -1
102+
103+
def quinify(registers, target_output):
104+
candidate_ras = [0]
105+
for i in range(len(target_output)):
106+
new_candidates = []
107+
for ra in candidate_ras:
108+
for j in range(2**3):
109+
candidate_ra = (ra << 3) + j
110+
_, out = run_program({'A': candidate_ra, 'B': 0, 'C': 0},target_output)
111+
if target_output[-(i + 1):] == out:
112+
# print(f"Possibility: {candidate_ra} I: {i}")
113+
# print(f"Output: {out} Target: {target_output[-(i + 1):]}")
114+
new_candidates.append(candidate_ra)
115+
116+
candidate_ras = new_candidates
117+
118+
return min(candidate_ras)
119+
94120
def part1(input_text):
95121
registers, program = parse(input_text)
96122
_, output = run_program(registers, program)
97123
return output
98124

99125
def part2(input_text):
100-
return 0
126+
start_registers, program = parse(input_text)
127+
register_a = quinify(start_registers, program)
128+
return register_a
101129

102130
if __name__ == "__main__":
103131
with open(__file__.rsplit('/', 1)[0] + "/input.txt", 'r') as file:

2024/17/daily_test.py

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ def sample_data():
1111
Program: 0,1,5,4,3,0
1212
"""
1313

14-
@pytest.fixture
15-
def parsed_data_a(sample_data):
16-
return parse(sample_data)
17-
1814
def test_parse(sample_data):
1915
registers, program = parse(sample_data)
2016

@@ -73,5 +69,44 @@ def test_run_program(initial_registers, program, expected_registers, expected_ou
7369
def test_part1(sample_data):
7470
assert part1(sample_data) == [4,6,3,5,6,3,5,2,1,0]
7571

76-
# def test_part2(sample_data_a):
77-
# assert part2(sample_data_a) == 45
72+
@pytest.fixture
73+
def sample_data_part_2():
74+
return """
75+
Register A: 2024
76+
Register B: 0
77+
Register C: 0
78+
79+
Program: 0,3,5,4,3,0
80+
"""
81+
82+
def test_part2_checks(sample_data_part_2):
83+
start_registers, program = parse(sample_data_part_2)
84+
registers, output = run_program(start_registers, program)
85+
86+
print(f"Registers: {registers}")
87+
print(f"Output: {output}")
88+
89+
start_registers, program = parse(sample_data_part_2)
90+
start_registers['A'] = 117440
91+
registers, output = run_program(start_registers, program)
92+
93+
print(f"Registers: {registers}")
94+
print(f"Output: {output}")
95+
# assert False == True
96+
97+
def test_quinify(sample_data_part_2):
98+
start_registers, program = parse(sample_data_part_2)
99+
register_a = quinify(start_registers, program)
100+
101+
assert register_a == 117440
102+
103+
def test_verify():
104+
r = {'A': 62343326, 'B': 0, 'C': 0}
105+
program = [2,4,1,5,7,5,1,6,4,3,5,5,0,3,3,0]
106+
107+
_, output = run_program(r, program)
108+
assert output == [6, 4, 3, 5, 5, 0, 3, 3, 0]
109+
110+
111+
# def test_part2(sample_data_part_2):
112+
# assert part2(sample_data_part_2) == 117440

0 commit comments

Comments
 (0)