Skip to content

Commit b8d8243

Browse files
committed
feat: 2024 day 17
1 parent 4d841cb commit b8d8243

File tree

3 files changed

+103
-0
lines changed

3 files changed

+103
-0
lines changed

2024/17a.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from aoc import *
2+
3+
4+
def main(infi: str):
5+
inp = filerstrip(infi)
6+
registers, program = inp.split('\n\n')
7+
a, b, c = map(
8+
lambda x: int(x[len('Register A: ') :]), registers.split('\n')
9+
)
10+
11+
def combo(op):
12+
if 0 <= op <= 3:
13+
return op
14+
elif op == 4:
15+
return a
16+
elif op == 5:
17+
return b
18+
elif op == 6:
19+
return c
20+
raise RuntimeError('combo')
21+
22+
prog = list(map(int, program[len('Program: ') :].split(',')))
23+
ip = 0
24+
out = []
25+
while 0 <= ip < len(prog):
26+
if prog[ip] == 0:
27+
a = a // (2 ** combo(prog[ip + 1]))
28+
elif prog[ip] == 1:
29+
b = b ^ prog[ip + 1]
30+
elif prog[ip] == 2:
31+
b = combo(prog[ip + 1]) % 8
32+
elif prog[ip] == 3:
33+
if a:
34+
ip = prog[ip + 1]
35+
continue
36+
elif prog[ip] == 4:
37+
b = b ^ c
38+
elif prog[ip] == 5:
39+
out.append(combo(prog[ip + 1]) % 8)
40+
# print(out[-1])
41+
elif prog[ip] == 6:
42+
b = a // (2 ** combo(prog[ip + 1]))
43+
elif prog[ip] == 7:
44+
c = a // (2 ** combo(prog[ip + 1]))
45+
ip += 2
46+
return ','.join(map(str, out))
47+
48+
49+
DAY = 17
50+
FILE_TEST = f"{DAY}_testa.txt"
51+
# FILE_TEST = f"{DAY}_testb.txt"
52+
FILE_EXP = f"{DAY}_exp.txt"
53+
FILE = f"{DAY}.txt"
54+
# test_and_submit(main, FILE_TEST, FILE_EXP, FILE, DAY)
55+
# print(main(FILE_TEST))
56+
print(main(FILE))

2024/17b.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from aoc import *
2+
3+
4+
def solve(ae, out):
5+
if not out:
6+
return ae
7+
# For the first iteration (lowest search depth), the range should be (1, 8).
8+
# But it doesn't matter, since the result is found anyway.
9+
for rem in range(0, 8):
10+
astart = ae * 8 + rem
11+
b1 = rem
12+
b2 = b1 ^ 5
13+
c1 = astart // 2**b2
14+
b3 = b2 ^ c1
15+
b4 = b3 ^ 6
16+
oute = b4 % 8
17+
if oute == out[0]:
18+
if (ret := solve(astart, out[1:])) is not None:
19+
return ret
20+
21+
22+
def main(infi: str):
23+
out = list(
24+
reversed(
25+
list(
26+
map(
27+
int,
28+
filerstrip(infi)
29+
.split('\n\n')[1][len('Program: ') :]
30+
.split(','),
31+
)
32+
)
33+
)
34+
)
35+
36+
return solve(0, out)
37+
38+
39+
DAY = 17
40+
FILE_TEST = f"{DAY}_testa.txt"
41+
# FILE_TEST = f"{DAY}_testb.txt"
42+
FILE_EXP = f"{DAY}_exp.txt"
43+
FILE = f"{DAY}.txt"
44+
# test_and_submit(main, FILE_TEST, FILE_EXP, FILE, DAY)
45+
# print(main(FILE_TEST))
46+
print(main(FILE))

README.org

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Personal Stats 2024
55
| Day | Time | Rank | Score | Time | Rank | Score |
66
|-----+----------+------+-------+----------+-------+-------|
7+
| 17 | 00:27:08 | 1748 | 0 | 07:06:10 | 5688 | 0 |
78
| 15 | 00:32:17 | 2397 | 0 | 02:59:49 | 4379 | 0 |
89
| 14 | 00:19:09 | 1902 | 0 | 01:13:46 | 3551 | 0 |
910
| 13 | 00:39:23 | 4308 | 0 | 12:34:52 | 21706 | 0 |

0 commit comments

Comments
 (0)