Advertisement
Guest User

Untitled

a guest
Dec 25th, 2021
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.56 KB | None | 0 0
  1.  
  2. file = "day_24.dat"
  3.  
  4. digit_process = []
  5.  
  6. with open(file, 'r') as f:
  7.     process = []
  8.     for line in f:
  9.         line = line.strip()
  10.  
  11.         if line.startswith("inp"):
  12.             if process:
  13.                 digit_process.append(process)
  14.             process = []
  15.  
  16.         process.append(line.split())
  17.     digit_process.append(process)
  18. N = len(digit_process)
  19.  
  20. class Number:
  21.     def __init__(self, digit):
  22.         self.digit = digit
  23.  
  24.     def __repr__(self):
  25.         return f"Digit {self.digit}"
  26.  
  27. variables = {"x": [], "y": [], "z": [], "w": []}
  28. constraints = []
  29. for i in range(14):
  30.     # Process each block and see what are the constraints
  31.     block = digit_process[i]
  32.     fulfilled_constraint = True
  33.     for command in digit_process[i]:
  34.         instr = command[0]
  35.         v1 = command[1]
  36.  
  37.         if instr == "inp":
  38.             variables["w"] = [Number(i)]
  39.             continue
  40.  
  41.         v2 = command[2]
  42.         if v2 in variables:
  43.             val2 = variables[v2]
  44.         else:
  45.             val2 = int(v2)
  46.  
  47.         if instr == "mul":
  48.             if val2 == 0:
  49.                 variables[v1] = []
  50.         elif instr == "add":
  51.             if v1 == "x":
  52.                 if v2 == "z":
  53.                     # We append the contents of z to x
  54.                     variables[v1] += [_[:] for _ in variables[v2]]
  55.                 else:
  56.                     variables[v1].append(val2)
  57.             elif v1 == "y":
  58.                 if val2 == 25:
  59.                     continue
  60.                 else:
  61.                     if isinstance(val2, list):
  62.                         variables[v1] += val2[:]
  63.                     else:
  64.                         variables[v1].append(val2)
  65.             elif v1 == "z":
  66.                 if v2 == "y":
  67.                     if fulfilled_constraint:
  68.                         # Basically do nothing
  69.                         pass
  70.                     else:
  71.                         variables[v1].append(variables[v2][:])
  72.         elif instr == "mod":
  73.             if val2 == 26:
  74.                 if variables[v1]:
  75.                     variables[v1] = variables[v1][-1]
  76.         elif instr == "div":
  77.             if val2 == 1:
  78.                 continue
  79.             elif val2 == 26:
  80.                 if v1 == "z":
  81.                     variables[v1].pop()
  82.         elif instr == "eql":
  83.             if v1 == "x":
  84.                 if v2 == "w":
  85.                     if variables[v1]:
  86.                         _sum = 0
  87.                         for el in variables[v1]:
  88.                             if isinstance(el, list):
  89.                                 continue
  90.                             if isinstance(el, Number):
  91.                                 continue
  92.                             _sum += el
  93.  
  94.                         if _sum > 9:
  95.                             fulfilled_constraint = False
  96.                         if fulfilled_constraint:
  97.                             # If we have a constraint
  98.                             constraints.append([variables[v1][:], Number(i)])
  99.                         variables[v1] = []
  100.                 elif val2 == 0:
  101.                     # We do nothing because in the previous block we assume if
  102.                     # we have a fulfilled constraint or not
  103.                     #variables[v1] = []
  104.                     pass
  105.  
  106.  
  107.  
  108. def get_serial_number(constraints, part=1):
  109.     # For part one find the maximum possible digit
  110.     serial_number = ["" for i in range(14)]
  111.  
  112.     for constraint in constraints:
  113.         # Figure out which indexes to process
  114.         # LHS
  115.         lhs_index = None
  116.         lhs_constraint = 0
  117.         for content in constraint[0]:
  118.             if isinstance(content, Number):
  119.                 lhs_index = content.digit
  120.             else:
  121.                 lhs_constraint += content
  122.  
  123.         # RHS
  124.         rhs_index = constraint[1].digit
  125.         if part==1:
  126.             # Get maximum number
  127.             if lhs_constraint > 0:
  128.                 serial_number[lhs_index] = 9 - lhs_constraint
  129.                 serial_number[rhs_index] = 9
  130.             else:
  131.                 serial_number[lhs_index] = 9
  132.                 serial_number[rhs_index] = 9 + lhs_constraint
  133.         else:
  134.             if lhs_constraint > 0:
  135.                 serial_number[lhs_index] = 1
  136.                 serial_number[rhs_index] = 1 + lhs_constraint
  137.             else:
  138.                 serial_number[lhs_index] = abs(lhs_constraint) + 1
  139.                 serial_number[rhs_index] = 1
  140.     return ''.join([str(_) for _ in serial_number])
  141. print("Part 1: ", get_serial_number(constraints, 1))
  142. print("Part 2: ", get_serial_number(constraints, 2))
  143.  
  144.  
  145.  
  146.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement