input = open("input", 'r').read().split("\n\n") # d = [line for line in input] rl = [line.split("|") for line in input[0].split("\n")] d = [[int(v) for v in line.split(",") if v != ""] for line in input[1].split("\n") if line != ""] r = {} for rule in rl: f,s = rule f,s = int(f),int(s) if s in r: r[s].add(f) else: r[s] = {f} def run(p2=False): sm = 0 for p in d: sp = set(p) seen = set() if p2: while len(seen) != len(sp): seen = set() for i, v in enumerate(p): reqs = sp & (r[v] if v in r else set()) if reqs > seen: ind = max([p.index(j) for j in reqs]) p[i], p[ind] = p[ind], p[i] break seen.add(v) sm += p[(len(p)//2)] else: for v in p: reqs = sp & (r[v] if v in r else set()) if reqs > seen: break seen.add(v) if len(seen) == len(sp): sm += p[(len(p)//2)] return sm p1 = run() p2 = run(True) print(p1) print(p2 - p1)