This commit is contained in:
Ben Charlton 2020-12-14 20:39:36 +00:00
parent cad93afe60
commit c64405d7ba

61
14/14.py Normal file
View file

@ -0,0 +1,61 @@
#!/usr/bin/python3
import sys, re
mask = None
def parse_mask(mask):
mask0 = mask1 = mask
mask0 = mask0.replace('X','1')
mask1 = mask1.replace('X','0')
return(int(mask0,2), int(mask1,2))
def setbit(val, offset):
mask = 1 << offset
return (val | mask)
def clearbit(val, offset):
mask = ~(1 << offset)
return (val & mask)
def parse_mask2(val, mask):
mask = mask[::-1]
nums = [val]
for m in range(len(mask)):
t = []
for v in nums:
if mask[m] == 'X':
t.append(setbit(v, m))
t.append(clearbit(v, m))
else:
t.append(v)
nums = t
return nums
p1 = {}
p2 = {}
mask0 = mask1 = 0
tmask = ""
for line in sys.stdin:
line = line.rstrip()
m = re.match(r'^mask \= (\S+)$', line)
if m is not None:
tmask = m.group(1)
(mask0, mask1) = parse_mask(tmask)
continue
m = re.match(r'^mem\[(\d+)\] = (\d+)$', line)
p2pos = pos = int(m.group(1))
p2val = val = int(m.group(2))
val = val & mask0
val = val | mask1
p1[pos] = val
p2perms = parse_mask2(p2pos | mask1, tmask)
for p in p2perms:
p2[p] = p2val
print(1, sum(p1.values()))
print(2, sum(p2.values()))