-
Notifications
You must be signed in to change notification settings - Fork 0
/
14.py
69 lines (59 loc) · 1.58 KB
/
14.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import re
from itertools import permutations
with open("input14.txt") as f:
lines = f.readlines()
# Part 1
xor_mask = "1" * 36
mem = {}
def apply_mask(inp):
mask1 = int(mask.replace('X', '0'), 2)
output = inp | mask1
mask0 = int(mask.replace('X', '1'), 2)
output = output & mask0
return output
for l in lines:
if l.startswith('mask = '):
mask = l.strip()[7:]
else:
k, v = re.match(r'mem\[(\d+)\] = (\d+)', l).groups()
mem[k] = apply_mask(int(v))
print(sum(mem.values()))
print()
# Part 2
mem = {}
def get_binary_strings(length):
res = []
def _get_binary_strings(s, length):
if length == 0:
res.append(s)
else:
_get_binary_strings(s + '0', length-1)
_get_binary_strings(s + '1', length-1)
_get_binary_strings("", length)
return res
def get_addresses(inp, mask):
xs = mask.count('X')
res = []
for bs in get_binary_strings(xs):
o = f'{mask}'
for b in bs:
o = o.replace('X', b, 1)
o = inp | int(o, 2)
mask_1 = '1' * 36
cnt = 0
for i, c in enumerate(mask):
if c == 'X':
mask_1 = mask_1[0:i] + bs[cnt] + mask_1[i+1:]
cnt += 1
o = o & int(mask_1, 2)
res.append(o)
return res
for l in lines:
if l.startswith('mask = '):
mask = l.strip()[7:]
else:
k, v = re.match(r'mem\[(\d+)\] = (\d+)', l).groups()
addresses = get_addresses(int(k), mask)
for a in addresses:
mem[a] = int(v)
print(sum(mem.values()))