-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday14.py
More file actions
80 lines (72 loc) · 2.27 KB
/
day14.py
File metadata and controls
80 lines (72 loc) · 2.27 KB
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
70
71
72
73
74
75
76
77
78
79
80
import re
lines = open('day14-input.txt').readlines()
def applyBitmask(mask, value):
binary = format(value, '#038b')
masked = '0b'
for i in range(len(mask)):
if mask[i] == 'X':
# + 2 because of the leading 0b characters
masked += binary[i + 2]
else:
masked += mask[i]
return int(masked, 2)
# applyBitmask('XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X', 11)
# applyBitmask('XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X', 101)
# applyBitmask('XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X', 0)
def solve1(program):
mem = {}
mask = None
for ins in program:
if ins.startswith('mask'):
_, mask = ins.split('=')
mask = mask.strip()
elif ins.startswith('mem'):
register, value = ins.split('=')
register = int(re.findall('\[\d+\]', register)[0][1:-1])
value = int(value)
#write to memory
mem[register] = applyBitmask(mask, value)
total = 0
for k in mem:
total += mem[k]
return total
print(solve1(lines))
def applyBitmaskToAddr(mask, addr):
addrs = ['']
binary = format(addr, '#038b')
masked = '0b'
for i in range(len(mask)):
if mask[i] == 'X':
with_zeros = []
with_ones = []
for a in addrs:
with_zeros.append(a + '0')
for a in addrs:
with_ones.append(a + '1')
addrs = with_zeros + with_ones
elif mask[i] == '1':
addrs = [a + '1' for a in addrs]
else:
addrs = [a + binary[i + 2] for a in addrs]
return [int(a, 2) for a in addrs]
applyBitmaskToAddr('000000000000000000000000000000X1001X', 42)
def solve2(program):
mem = {}
mask = None
for ins in program:
if ins.startswith('mask'):
_, mask = ins.split('=')
mask = mask.strip()
elif ins.startswith('mem'):
register, value = ins.split('=')
register = int(re.findall('\[\d+\]', register)[0][1:-1])
value = int(value)
addrs = applyBitmaskToAddr(mask, register)
#write to memory
for addr in addrs:
mem[addr] = value
total = 0
for k in mem:
total += mem[k]
return total
print(solve2(lines))