-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay14_part2.py
77 lines (67 loc) · 2.43 KB
/
Day14_part2.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
70
71
72
73
74
75
76
77
rows = []
f = open("Inputs/Day14.txt", "r")
mask = ''
for x in f:
parts = x.rstrip().split(' = ')
if (parts[0] == 'mask'):
mask = parts[1]
else:
new_row = {'mask': mask, 'mem_addr': int(''.join(filter(str.isdigit, parts[0]))), 'init_value': int(parts[1])}
rows.append(new_row)
#def apply_mask(number, mask):
# bit_string = '{0:b}'.format(number)
# result_bitstr = ''
# for i in range(len(bit_string)):
# index = (len(bit_string) - i) - 1
# mask_index = (len(mask) - i) - 1
# # We've run out of bits, just apply const mask values now
# if mask[mask_index] == 'X':
# result_bitstr = 'X' + result_bitstr
# elif(mask[mask_index] == '1'):
# result_bitstr = '1' + result_bitstr
# else:
# result_bitstr = bit_string[index] + result_bitstr
# return result_bitstr
def apply_mask(number, mask):
bit_string = '{0:b}'.format(number)
result_bitstr = ''
for i in range(len(mask)):
index = (len(bit_string) - i) - 1
mask_index = (len(mask) - i) - 1
# We've run out of bits, just apply mask values now
if (index < 0):
if mask[mask_index] == 'X':
result_bitstr = 'X' + result_bitstr
elif(mask[mask_index] == '1'):
result_bitstr = '1' + result_bitstr
else:
result_bitstr = '0' + result_bitstr
else:
if mask[mask_index] == 'X':
result_bitstr = 'X' + result_bitstr
elif(mask[mask_index] == '1'):
result_bitstr = '1' + result_bitstr
else:
result_bitstr = bit_string[index] + result_bitstr
return result_bitstr
def calc_mask_float(mask):
resulting_numbers = []
stack = []
stack.append(mask)
while len(stack) > 0:
proto = stack.pop()
if 'X' in proto:
# Floating bits remain - calc the first one found
i = proto.index('X')
stack.append(proto[:i] + '1' + proto[i+1:])
stack.append(proto[:i] + '0' + proto[i+1:])
else:
resulting_numbers.append(int(proto, 2))
return resulting_numbers
registers = {}
for r in rows:
r['address_mask'] = apply_mask(r['mem_addr'], r['mask'])
overwrite_addresses = calc_mask_float(r['address_mask'])
for add in overwrite_addresses:
registers[add] = r['init_value']
print(sum(registers.values()))