-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.py
29 lines (25 loc) · 921 Bytes
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from itertools import product
from parse import search
def possible_addrs(mask, addr):
mask2 = "".join(v if m == "0" else m for m, v in zip(mask, f"{addr:036b}"))
res = []
for t in product("01", repeat=mask2.count("X")):
it = iter(t)
res.append(int("".join(next(it) if c == "X" else c for c in mask2), 2))
return res
with open("input.txt") as f:
lines = [x.strip() for x in f]
for is_part1 in [True, False]:
mask = ""
mem = {}
for line in lines:
if line.startswith("mask"):
mask = line.split(" = ")[1]
else:
arg1, arg2 = search("mem[{:d}] = {:d}", line).fixed
if is_part1:
mem[arg1] = int("".join(v if m == "X" else m for m, v in zip(mask, f"{arg2:036b}")), 2)
else:
for addr in possible_addrs(mask, arg1):
mem[addr] = arg2
print(sum(mem.values()))