import re def part1(): mem = {} mask0 = 0 mask1 = 0 with open('input.txt') as fh: for line in fh: m = re.match('mask = ([X01]+)$', line) if m: mask = m[1] mask0 = int(mask.replace('X', '1'), 2) mask1 = int(mask.replace('X', '0'), 2) continue m = re.match('mem\[([0-9]+)\] = ([0-9]+)$', line) if m: i = int(m[1]) v = int(m[2]) mem[i] = (v & mask0) | mask1 return sum(mem.values()) def iter_keys(i, mask): if not mask: yield 0 else: for k in iter_keys(i >> 1, mask[:-1]): if mask[-1] == 'X': yield k << 1 yield (k << 1) | 1 elif mask[-1] == '1': yield (k << 1) | 1 else: yield (k << 1) | (i % 2) def part2(): mem = {} mask = '' with open('input.txt') as fh: for line in fh: m = re.match('mask = ([X01]+)$', line) if m: mask = m[1] continue m = re.match('mem\[([0-9]+)\] = ([0-9]+)$', line) if m: i = int(m[1]) v = int(m[2]) for k in iter_keys(i, mask): mem[k] = v return sum(mem.values()) print(part1()) print(part2())