from functools import reduce from itertools import permutations text = open(0).read() inp = [eval(line) for line in text.splitlines()] def explode(state): last = None carry = None def mut(parent, idx, depth=1): nonlocal last, carry if type(parent[idx]) == int: last = parent, idx if carry: parent[idx] += carry raise RuntimeError elif carry is None and depth == 4: x, y = parent[idx] if last: p, j = last p[j] += x carry = y parent[idx] = 0 else: mut(parent[idx], 0, depth + 1) mut(parent[idx], 1, depth + 1) try: mut(state, 0) mut(state, 1) except RuntimeError: pass return carry is not None def split(state): def mut(par, idx): if type(par[idx]) == int: N = int(par[idx]) if N >= 10: par[idx] = [N // 2, N // 2 + (N & 1)] raise RuntimeError else: mut(par[idx], 0) mut(par[idx], 1) try: mut(state, 0) mut(state, 1) except RuntimeError: return True def add(a, b): state = eval(str([a, b])) while True: if explode(state): continue elif split(state): continue else: break return state def magnitude(seq): if type(seq) == int: return seq x, y = seq return 3 * magnitude(x) + 2 * magnitude(y) print(magnitude(reduce(add, inp))) print(max(magnitude(add(*pair)) for pair in permutations(inp, 2)))