/ Python / 2017 / 07.py
07.py
 1  from lib import *
 2  
 3  input = read_input(2017, 7)
 4  
 5  lines = input.splitlines()
 6  
 7  
 8  names = set()
 9  subs = set()
10  for line in lines:
11      name = line.split()[0]
12      sub = [] if "->" not in line else line.split("-> ")[1].split(", ")
13      names.add(name)
14      subs.update(sub)
15  
16  print(next(iter(names - subs)))
17  
18  
19  progs = {}
20  names = set()
21  subs = set()
22  for line in lines:
23      name = line.split()[0]
24      weight = int(line.split("(")[1].split(")")[0])
25      sub = [] if "->" not in line else line.split("-> ")[1].split(", ")
26      progs[name] = weight, sub
27      names.add(name)
28      subs.update(sub)
29  
30  root = next(iter(names - subs))
31  
32  
33  def check_sum(p):
34      s = progs[p][0]
35      w = {}
36      for q in progs[p][1]:
37          a, b = check_sum(q)
38          if a is not None:
39              return a, None
40          s += b
41          w[q] = b
42  
43      x = max(w.values(), key=list(w.values()).count, default=None)
44  
45      for k, v in w.items():
46          if v != x:
47              return x - (v - progs[k][0]), None
48  
49      return None, s
50  
51  
52  print(check_sum(root)[0])