1
0
Fork 0
adventofcode/2017/7/tower.py

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]))