Advertisement
Guest User

Untitled

a guest
Dec 18th, 2021
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.22 KB | None | 0 0
  1. from utils import *
  2.  
  3. class Node:
  4.     def __init__(self, parent, data, left=None, right=None):
  5.         self.parent = parent
  6.         self.data = data
  7.         self.left = left
  8.         self.right = right
  9.  
  10.     def __str__(self):
  11.         if self.data is not None:
  12.             return str(self.data)
  13.         else:
  14.             return f"[{self.left}, {self.right}]"
  15.  
  16. def parse(raw):
  17.     # convert nested array into binary tree
  18.     def convert(data, parent=None):
  19.         if type(data) == int:
  20.             return Node(parent, data)
  21.         else:
  22.             node = Node(parent, None)
  23.             left = convert(data[0], node)
  24.             right = convert(data[1], node)
  25.             node.left = left
  26.             node.right = right
  27.             return node
  28.     return convert(raw)
  29.  
  30. def runref(data):
  31.     val = data
  32.     while True:
  33.         try:
  34.             linear = linearlize(val)
  35.             red1(linear, val, 0)
  36.             red2(linear, val, 0)
  37.             return val
  38.         # Forgive me for I have sinned
  39.         except Exception as e:
  40.             # print(e.with_traceback())
  41.             pass
  42.  
  43. def linearlize(cur):
  44.     if cur.data is None:
  45.         return [cur, *linearlize(cur.left), *linearlize(cur.right)]
  46.     else:
  47.         return [cur]
  48.  
  49. def red1(linear: list, node, depth):
  50.     if node.data is None and depth > 3 and node.left.data is not None and node.right.data is not None:
  51.         l = node.left.data
  52.         r = node.right.data
  53.        
  54.         index = linear.index(node)
  55.         for i in range(index, -1, -1):
  56.             if linear[i].data is not None:
  57.                 linear[i].data += l
  58.                 break
  59.        
  60.         for i in range(index + 3, len(linear)):
  61.             if linear[i].data is not None:
  62.                 linear[i].data += r
  63.                 break
  64.        
  65.         # Zero out this node
  66.         node.data = 0
  67.         node.left = None
  68.         node.right = None
  69.  
  70.         raise Exception()
  71.     elif node.data is None:
  72.         red1(linear, node.left, depth + 1)
  73.         red1(linear, node.right, depth + 1)
  74.  
  75.        
  76. def red2(linear: list, node, depth):
  77.     if node.data is not None:
  78.         # Check if split is needed
  79.         if node.data > 9:
  80.             node.left = Node(node, math.floor(node.data / 2))
  81.             node.right = Node(node, math.ceil(node.data / 2))
  82.             node.data = None
  83.             raise Exception()
  84.     elif node.data is None:
  85.         red2(linear, node.left, depth + 1)
  86.         red2(linear, node.right, depth + 1)
  87.  
  88. def mag(node):
  89.     if node.data is None:
  90.         return 3*mag(node.left) + 2*mag(node.right)
  91.     else:
  92.         return node.data
  93.  
  94. def run():
  95.     file = open(sys.argv[1] if len(sys.argv) > 1 else 'input.txt', "r")
  96.     data = file.read()
  97.     lines = data.splitlines()  
  98.  
  99.     m = 0
  100.     for _l in lines:
  101.         for _r in lines:
  102.             if _l != _r:    
  103.                 l = parse(eval(_l))
  104.                 r = parse(eval(_r))
  105.                
  106.                 newv = Node(None, None)
  107.                 newv.left = l
  108.                 newv.right = r
  109.                 l.parent = newv
  110.                 r.parent = newv
  111.                 v = runref(newv)
  112.                 m = max(m, mag(v))
  113.     print(m)
  114.  
  115.  
  116. if __name__ == "__main__":
  117.     run()
  118.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement