advent-of-code/2017/d07/ex1/ex1.py

42 lines
991 B
Python
Executable file

#!/usr/bin/env python
import sys
from typing import NamedTuple
class ProgramYell(NamedTuple):
weight: int
children: set[str]
Tower = dict[str, ProgramYell]
def solve(input: str) -> str:
def parse_line(line: str) -> tuple[str, ProgramYell]:
name, rest = line.split(" ", 1)
weight, rest = rest.split(")")
children = set(rest.removeprefix(" -> ").split(", ")) if rest else set()
return name, ProgramYell(int(weight[1:]), children)
def parse(input: str) -> Tower:
return {name: yell for name, yell in map(parse_line, input.splitlines())}
def find_base(tower: Tower) -> str:
candidates = set(tower.keys())
for yell in tower.values():
candidates -= yell.children
assert len(candidates) == 1
return candidates.pop()
tower = parse(input)
return find_base(tower)
def main() -> None:
input = sys.stdin.read()
print(solve(input))
if __name__ == "__main__":
main()