34 lines
1.2 KiB
Python
Executable File
34 lines
1.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import sys, re
|
|
from collections import Counter
|
|
pattern = re.compile(r"([a-z]+) \(([0-9]+)\)( -> (.+))?")
|
|
data = [pattern.findall(line.strip())[0] for line in sys.stdin.readlines()]
|
|
programs = {}
|
|
for line in data:
|
|
try:
|
|
programs[line[0]] = re.split(r', ', line[2][4:])
|
|
if programs[line[0]] == ['']:
|
|
programs[line[0]] == []
|
|
except IndexError:
|
|
programs[line[0]] = []
|
|
for prog in programs:
|
|
if any(prog in programs[p] for p in programs):
|
|
continue
|
|
root = prog
|
|
|
|
def weight(program):
|
|
thisweight = [int(line[1]) for line in data if line[0] == program][0]
|
|
if len(programs[program]) > 0 and '' not in programs[program]:
|
|
return thisweight + sum(weight(sub) for sub in programs[program])
|
|
return thisweight
|
|
|
|
def find_wrong_weight(program):
|
|
subs = {k: v for (k, v) in weights if k in programs[program]}
|
|
if len(set(subs.values())) > 1:
|
|
return find_wrong_weight(list(subs.keys())[list(subs.values()).index(Counter(subs.values()).most_common(2)[1][0])])
|
|
return (program, weight(program))
|
|
|
|
weights = {(p, weight(p)) for p in programs}
|
|
wrong = find_wrong_weight(root)
|
|
print(next({k: v for (k, v) in weights if k in programs[p]} for p in programs if wrong[0] in programs[p]))
|