Advertisement
Guest User

aoc2020 day14

a guest
Dec 14th, 2020
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.31 KB | None | 0 0
  1. def decode(line):
  2.     lhs, rhs = line.split(' = ')
  3.     if lhs == 'mask':
  4.         mask1 = int(rhs.replace('X', '1'), base=2)
  5.         mask2 = int(rhs.replace('X', '0'), base=2)
  6.         return lhs, (mask1, mask2, rhs)
  7.     elif lhs[:3] == 'mem':
  8.         address = int(lhs[4:-1])
  9.         value = int(rhs)
  10.         return address, value
  11.  
  12.  
  13. def addresses(base, mask, offset=0):
  14.     for i, bit in enumerate(reversed(mask)):
  15.         j = i + offset
  16.         if bit == 'X':
  17.             new_address = base ^ (1 << j)
  18.             for address in addresses(new_address, mask[:-(i + 1)], j + 1):
  19.                 yield address
  20.  
  21.     yield base
  22.  
  23.  
  24. def solve(lines, callback):
  25.     memory = {}
  26.     current_mask = 0
  27.     for lhs, rhs in map(decode, lines):
  28.         if lhs == 'mask':
  29.             current_mask = rhs
  30.         else:
  31.             callback(memory, lhs, rhs, current_mask)
  32.  
  33.     return sum(memory.values())
  34.  
  35.  
  36. def solve_part1(memory, address, value, mask):
  37.     value &= mask[0]
  38.     value |= mask[1]
  39.     memory[address] = value
  40.  
  41.  
  42. def solve_part2(memory, address, value, mask):
  43.     for address in addresses(address | mask[1], mask[2]):
  44.         memory[address] = value
  45.  
  46.  
  47. with open('input_day14') as f:
  48.     lines = f.read().strip().split('\n')
  49.     print(solve(lines, solve_part1))
  50.     print(solve(lines, solve_part2))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement