You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
1.6 KiB
92 lines
1.6 KiB
|
|
import re
|
|
|
|
|
|
def decode_line(line):
|
|
mask = re.search(r"mask = (?P<mask>[1 | 0 | X]{36})", line)
|
|
mem = re.search(r"mem\[(?P<address>\d+)] = (?P<value>\d+)", line)
|
|
if mask:
|
|
return 'm', mask.group('mask')
|
|
if mem:
|
|
return mem.group('address', 'value')
|
|
|
|
|
|
def to_int(num):
|
|
new = 0
|
|
for j in range(0, len(num)):
|
|
if num[j] == '1':
|
|
new += 2**(len(num) - j - 1)
|
|
return new
|
|
|
|
|
|
def comb(num, mas):
|
|
num = f'{num:036b}'
|
|
mas = list(mas)
|
|
num = list(num)
|
|
for i in range(0, len(num)):
|
|
if mas[i] == '0':
|
|
num[i] = '0'
|
|
if mas[i] == '1':
|
|
num[i] = '1'
|
|
|
|
return to_int(num)
|
|
|
|
|
|
def execute(arg, val):
|
|
if arg == 'm':
|
|
global mask
|
|
mask = val
|
|
else:
|
|
memory[arg] = comb(int(val), mask)
|
|
|
|
|
|
|
|
def comb_address(num, mas):
|
|
mas = list(mas)
|
|
m = to_int(mas)
|
|
|
|
x = ['0'] * 36
|
|
for i in range(0, len(mas)):
|
|
if mas[i] == 'X':
|
|
x[i] = '1'
|
|
x = to_int(x)
|
|
|
|
num = num & ~x
|
|
comb = 0
|
|
|
|
for y in range(0, 2**mask.count('X')):
|
|
yield comb | num | m
|
|
comb = ((comb | ~x) + 1) & x
|
|
|
|
|
|
def execute_v2(arg, val):
|
|
if arg == 'm':
|
|
global mask
|
|
mask = val
|
|
else:
|
|
for ad in comb_address(int(arg), mask):
|
|
memory2[ad] = int(val)
|
|
|
|
|
|
with open(r"C:\Users\Maya\Desktop\Uni\WS_2021\AoC\input14") as f:
|
|
lines = f.readlines()
|
|
|
|
dec = [decode_line(l) for l in lines]
|
|
|
|
memory = {}
|
|
|
|
mask = 0
|
|
|
|
for d in dec:
|
|
execute(*d)
|
|
|
|
print(sum(memory.values()))
|
|
|
|
memory2 = {}
|
|
|
|
mask = 0
|
|
|
|
for d in dec:
|
|
execute_v2(*d)
|
|
|
|
print(sum(memory2.values()))
|
|
|