succession.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. '''
  2. > https://www.codingame.com/ide/puzzle/order-of-succession
  3. @author: olivier.massot, 2019
  4. '''
  5. class Person():
  6. def __init__(self, name, parent, birth, death, religion, gender):
  7. self.name = name
  8. self.parent_name = parent
  9. self.birth = int(birth)
  10. self.death = death
  11. self.religion = religion
  12. self.gender = gender
  13. self.alive = (self.death == "-")
  14. self.catholic = (self.religion == "Catholic")
  15. self.male = -1 if self.gender == "M" else 0
  16. self.parent = None
  17. self.children = []
  18. def __repr__(self):
  19. return self.name
  20. family = {p.name: p for p in [Person(*input().split()) for _ in range(int(input()))]}
  21. first_ancestor = None
  22. for p in family.values():
  23. p.parent = family.get(p.parent_name, None)
  24. if not p.parent:
  25. first_ancestor = p
  26. p.children = sorted([c for c in family.values() if c.parent_name == p.name], key=lambda x: (x.male, x.birth))
  27. def walk(root):
  28. succession = []
  29. def add(root):
  30. if root.alive and not root.catholic:
  31. succession.append(root)
  32. for child in root.children:
  33. add(child)
  34. add(root)
  35. return succession
  36. succession = walk(first_ancestor)
  37. for p in succession:
  38. print(p.name)