Day 14
This commit is contained in:
parent
b5f9c0ee1c
commit
d43c2fe4ae
55
2020/day14.py
Normal file
55
2020/day14.py
Normal file
|
@ -0,0 +1,55 @@
|
|||
import re
|
||||
import sys
|
||||
from itertools import combinations_with_replacement
|
||||
|
||||
|
||||
def main():
|
||||
lines = [line.rstrip() for line in sys.stdin]
|
||||
|
||||
# Part 1
|
||||
int_len = 36
|
||||
meme = {}
|
||||
mem_re = re.compile(r"mem\[(\d+)\] = (\d+)")
|
||||
for line in lines:
|
||||
if line.startswith("mask"):
|
||||
mask_str = line.split("=")[1].strip()
|
||||
elif (match := mem_re.match(line)):
|
||||
addr, value = map(int, match.groups())
|
||||
meme[addr] = apply_mask_p1(mask_str, value)
|
||||
print("Init sum:", sum(meme.values()))
|
||||
|
||||
# Part 2 - what a mess
|
||||
meme = {}
|
||||
for line in lines:
|
||||
if line.startswith("mask"):
|
||||
mask_str = line.split("=")[1].strip()
|
||||
ow_mask = int(mask_str.replace("X", "0"), 2)
|
||||
floats = [i for i in range(int_len) if mask_str[::-1][i] == "X"]
|
||||
elif (match := mem_re.match(line)):
|
||||
addr, value = map(int, match.groups())
|
||||
for masked_addr in apply_mask_p2(ow_mask, floats, addr):
|
||||
meme[masked_addr] = value
|
||||
print("Init sum p2:", sum(meme.values()))
|
||||
|
||||
|
||||
def apply_mask_p1(mask, value):
|
||||
value &= int(mask.replace("X", "1"), 2)
|
||||
return value | int(mask.replace("X", "0"), 2)
|
||||
|
||||
|
||||
def apply_mask_p2(ow_mask, floats, value):
|
||||
value |= ow_mask
|
||||
for bitbuffer in range(2 ** len(floats)):
|
||||
new_value = value
|
||||
for i, f in enumerate(floats):
|
||||
bitbuffer_pos = 1 << i
|
||||
bit_pos = 1 << f
|
||||
if bitbuffer & bitbuffer_pos != 0:
|
||||
new_value |= bit_pos
|
||||
else:
|
||||
new_value &= ~bit_pos
|
||||
yield new_value
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in a new issue