Skip to content

Commit 6c0a49a

Browse files
committed
Implement 2024 day 17 part 1
1 parent 17017e7 commit 6c0a49a

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed

2024/src/aoc/days/day17.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import re
2+
3+
from . import SeparateRunner
4+
5+
6+
class DayRunner(SeparateRunner):
7+
@classmethod
8+
def part1(cls, input: str) -> str:
9+
numbers = re.findall(r"\d+", input)
10+
11+
register_a, register_b, register_c = map(int, numbers[:3])
12+
program = list(map(int, numbers[3:]))
13+
14+
ip = 0
15+
out = []
16+
17+
def combo(index: int) -> int:
18+
match program[index]:
19+
case 0:
20+
return 0
21+
case 1:
22+
return 1
23+
case 2:
24+
return 2
25+
case 3:
26+
return 3
27+
case 4:
28+
return register_a
29+
case 5:
30+
return register_b
31+
case 6:
32+
return register_c
33+
34+
while ip < len(program):
35+
match program[ip]:
36+
case 0: # adv
37+
register_a = register_a // 2 ** combo(ip + 1)
38+
case 1: # bxl
39+
register_b ^= program[ip + 1]
40+
case 2: # bst
41+
register_b = combo(ip + 1) & 0x7
42+
case 3: # jnz
43+
if register_a != 0:
44+
ip = program[ip + 1]
45+
continue
46+
case 4: # bxc
47+
register_b ^= register_c
48+
case 5: # out
49+
out.append(combo(ip + 1) & 7)
50+
case 6: # bdv
51+
register_b = register_a // 2 ** combo(ip + 1)
52+
case 7: # cdv
53+
register_c = register_a // 2 ** combo(ip + 1)
54+
ip += 2
55+
56+
return ",".join(map(str, out))
57+
58+
@classmethod
59+
def part2(cls, input: str) -> str:
60+
pass

2024/tests/samples/17.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Register A: 729
2+
Register B: 0
3+
Register C: 0
4+
5+
Program: 0,1,5,4,3,0

2024/tests/test_day16.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,14 @@
1414
)
1515
def test_sample_part1(data: str, result: int) -> None:
1616
assert DayRunner.part1(data) == result
17+
18+
19+
@pytest.mark.parametrize(
20+
"data,result",
21+
[
22+
(get_data(16, 1), 45),
23+
(get_data(16, 2), 64),
24+
],
25+
)
26+
def test_sample_part2(data: str, result: int) -> None:
27+
assert DayRunner.part2(data) == result

2024/tests/test_day17.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from aoc.days.day17 import DayRunner
2+
3+
from . import get_data
4+
5+
6+
def test_sample_part1() -> None:
7+
assert DayRunner.part1(get_data(17)) == "4,6,3,5,6,3,5,2,1,0"

0 commit comments

Comments
 (0)