Advertisement
Guest User

Untitled

a guest
Dec 17th, 2021
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.83 KB | None | 0 0
  1. from tools import *
  2. from math import *
  3.  
  4. DAY = 18
  5. DEBUG = False
  6.  
  7.  
  8. def raw_input_data(
  9.     day: int,
  10. ):
  11.     if not DEBUG:
  12.         path = f"day{day}_input.txt"
  13.     else:
  14.         path = f"day{day}_input2.txt"
  15.  
  16.     with open(path, "r") as f:
  17.         return [line[:-1] for line in f]
  18.  
  19.  
  20. data = raw_input_data(DAY)
  21. print("\ndata:")
  22. print(data)
  23. print("\n")
  24.  
  25. # data = "\n".join(data).split("\n\n")
  26. # data = [scanf("%d %s", line_str) for line_str in data]
  27. # data = [[int(c) for c in line] for line in data ]
  28. # scanf("%d %s", line_str)
  29.  
  30. data = [eval(line) for line in data]
  31.  
  32.  
  33. try:
  34.     print("\n" + "data:")
  35.     pprint(data)
  36.     print("\n")
  37. except:
  38.     pass
  39.  
  40.  
  41. def items_by_path(expr):
  42.     if isinstance(expr, int):
  43.         return {(): expr}
  44.  
  45.     return {
  46.         **{
  47.             (child_index,) + path: item
  48.             for child_index, child in enumerate(expr)
  49.             for path, item in items_by_path(child).items()
  50.         },
  51.         **{(): expr},
  52.     }
  53.  
  54.  
  55. def at_path(expr, path):
  56.     if len(path) > 0:
  57.         return at_path(expr[path[0]], path[1:])
  58.     else:
  59.         return expr
  60.  
  61.  
  62. def set_path(expr, path, item):
  63.     if len(path) > 0:
  64.         index = path[0]
  65.         return (
  66.             expr[:index] + [set_path(expr[index], path[1:], item)] + expr[index + 1 :]
  67.         )
  68.     else:
  69.         return item
  70.  
  71.  
  72. def exploded(expr):
  73.     items = items_by_path(expr)
  74.     deep_pairs = [
  75.         path for path, item in items.items() if isinstance(item, list) if len(path) == 4
  76.     ]
  77.     if not deep_pairs:
  78.         raise ValueError
  79.     exploding_pair_path = sorted(deep_pairs)[0]
  80.  
  81.     left, right = at_path(expr, exploding_pair_path)
  82.     expr = set_path(expr, exploding_pair_path, 0)
  83.  
  84.     left_paths = [
  85.         (path, item)
  86.         for path, item in items.items()
  87.         if isinstance(item, int)
  88.         if path < exploding_pair_path
  89.         if path[: len(exploding_pair_path)] != exploding_pair_path
  90.     ]
  91.  
  92.     if left_paths:
  93.         left_number_path = max(
  94.             left_paths,
  95.         )[0]
  96.         prev_value = at_path(expr, left_number_path)
  97.         expr = set_path(expr, left_number_path, prev_value + left)
  98.  
  99.     right_paths = [
  100.         (path, item)
  101.         for path, item in items.items()
  102.         if isinstance(item, int)
  103.         if path > exploding_pair_path
  104.         if path[: len(exploding_pair_path)] != exploding_pair_path
  105.     ]
  106.     if right_paths:
  107.         right_number_path = min(
  108.             right_paths,
  109.         )[0]
  110.         prev_value = at_path(expr, right_number_path)
  111.         expr = set_path(expr, right_number_path, prev_value + right)
  112.  
  113.     return expr
  114.  
  115.  
  116. def split(expr):
  117.     items = items_by_path(expr)
  118.     large_ints = [
  119.         (path, value)
  120.         for path, value in items.items()
  121.         if isinstance(value, int)
  122.         if value > 9
  123.     ]
  124.  
  125.     assert len(large_ints)
  126.  
  127.     first_large_num_path, large_num = min(large_ints)
  128.  
  129.     return set_path(
  130.         expr, first_large_num_path, [floor(large_num / 2), ceil(large_num / 2)]
  131.     )
  132.  
  133.  
  134. def simplify_step(expr):
  135.     try:
  136.         return exploded(expr)
  137.     except ValueError:
  138.         pass
  139.     try:
  140.         return split(expr)
  141.     except AssertionError:
  142.         pass
  143.  
  144.     return expr
  145.  
  146.  
  147. def simplify(expr):
  148.     while True:
  149.         next_expr = simplify_step(expr)
  150.         if next_expr == expr:
  151.             return expr
  152.         expr = next_expr
  153.  
  154.  
  155. value = data[0]
  156. for i, line in enumerate(data[1:]):
  157.     value = [value, line]
  158.     value = simplify(value)
  159.  
  160. print(value)
  161.  
  162.  
  163. def magnitude(value):
  164.     if isinstance(value, list):
  165.         return 3 * magnitude(value[0]) + 2 * magnitude(value[1])
  166.     else:
  167.         return value
  168.  
  169.  
  170. print(magnitude(value))
  171.  
  172. print(
  173.     max(
  174.         magnitude(simplify([a, b]))
  175.         for ai, a in enumerate(data)
  176.         for bi, b in enumerate(data)
  177.         if ai != bi
  178.     )
  179. )
  180.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement