#!/usr/bin/env python import sys from dataclasses import dataclass, field from typing import Dict, List @dataclass class OrbitGraph: name: str children: List["OrbitGraph"] = field(default_factory=list) def make_orbits(description: List[str]) -> OrbitGraph: orbits: Dict[str, OrbitGraph] = {} def find_or_add(name: str) -> OrbitGraph: if name in orbits: return orbits[name] orbit = OrbitGraph(name) orbits[name] = orbit return orbit for l in description: parent, child = map(find_or_add, map(lambda x: x.strip(), l.split(")"))) parent.children.append(child) return orbits["COM"] # Assume common root is named 'COM' def count_orbits(root: OrbitGraph) -> int: ans = 0 stack = 0 # Count the number of direct and indirect orbits to the current root def helper(root: OrbitGraph): nonlocal ans nonlocal stack ans += stack # Count the number of orbits to this node stack += 1 # Add the current root to stack of parents for child in root.children: helper(child) # Count those orbits for each child stack -= 1 # Remove the current root from the stack of parents helper(root) return ans def main() -> None: print(count_orbits(make_orbits(sys.stdin.readlines()))) if __name__ == "__main__": main()