Guest User

AOC2020Day14inPython

a guest
Dec 14th, 2020
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 0.97 KB | None | 0 0
  1. data = [l.split(" = ") for l in open("data14.txt").readlines()]
  2.  
  3. # For Part 2 - this generates all the possible addresses given base and list of floating bits
  4. def setbit(n, b):   return n | 1<<b
  5. def clearbit(n, b): return n & ~(1<<b)
  6. def allfloats(base, fl):
  7.     if fl:
  8.         yield from allfloats(clearbit(base,fl[0]), fl[1:])
  9.         yield from allfloats(  setbit(base,fl[0]), fl[1:])
  10.     else:
  11.         yield base
  12.  
  13. mem1, mem2 = {}, {}
  14. for (op, val) in data:
  15.     if op == "mask":
  16.         # mask = 000X0001010X01111X110X1X011X01110100
  17.         setmask   = int(val.replace('X','0'),2)
  18.         clearmask = int(val.replace('X','1'),2)
  19.         fbits = [35-i for (i,c) in enumerate(val) if c=='X']
  20.     else:
  21.         # mem[6448] = 416920615
  22.         loc, val = int(op[4:-1]), int(val)
  23.         mem1[loc] = (val | setmask) & clearmask
  24.         for l in allfloats(loc | setmask, fbits): mem2[l] = val
  25.  
  26. print("Part 1: ",sum(mem1.values()))
  27. print("Part 2: ",sum(mem2.values()))
Advertisement
Add Comment
Please, Sign In to add comment