| @@ -0,0 +1,36 @@ | |||
| import re | |||
| import sys | |||
| from itertools import product | |||
| text = sys.stdin.read() | |||
| mem = {} | |||
| idem = {'0': '0', '1': '1'} | |||
| for line in text.splitlines(): | |||
| typ, val = line.split(' = ') | |||
| if typ.startswith('mask'): | |||
| mask = val | |||
| if typ.startswith('mem'): | |||
| pos = int(typ[4:-1]) | |||
| known = f'{int(val):b}'.zfill(len(mask)) | |||
| string = ''.join(idem.get(c, known[i]) for i, c in enumerate(mask)) | |||
| mem[pos] = int(string, 2) | |||
| print(sum(mem.values())) | |||
| mem = {} | |||
| idem = {'X': 'X', '1': '1'} | |||
| for line in text.splitlines(): | |||
| typ, val = line.split(' = ') | |||
| if typ.startswith('mask'): | |||
| mask = val | |||
| elif typ.startswith('mem'): | |||
| known = f'{int(typ[4:-1]):b}'.zfill(len(mask)) | |||
| string = ''.join(idem.get(c, known[i]) for i, c in enumerate(mask)) | |||
| for gen in map(iter, product('01', repeat=string.count('X'))): | |||
| tmp = re.sub('X', lambda m: next(gen), string) | |||
| pos = int(tmp, 2) | |||
| mem[pos] = int(val) | |||
| print(sum(mem.values())) | |||