14_reindeer.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/env python3
  2. import sys
  3. import re
  4. class Reindeer:
  5. def __init__(self, name, speed, flight, rest):
  6. self.name = name
  7. self.speed = speed
  8. self.flight = flight
  9. self.rest = rest
  10. def dist(self, duration):
  11. elapsed = 0
  12. travelled = 0
  13. while elapsed < duration:
  14. elapsed += self.flight + self.rest
  15. travelled += self.flight * self.speed
  16. elapsed -= self.rest
  17. if elapsed > duration:
  18. travelled -= self.speed * (elapsed - duration)
  19. return travelled
  20. @classmethod
  21. def parse(cls, line):
  22. pat = r'(\w+) can fly (\d+) .* (\d+) .* (\d+) seconds\.'
  23. name, speed, flight, rest = re.match(pat, line).groups()
  24. return cls(name, int(speed), int(flight), int(rest))
  25. def scores(reindeer, duration):
  26. for r in reindeer:
  27. r.period = r.flight
  28. r.lead = 0
  29. r.travelled = 0
  30. for sec in range(duration):
  31. for r in reindeer:
  32. if r.period > 0:
  33. r.travelled += r.speed
  34. r.period -= 1
  35. if r.period == -r.rest:
  36. r.period = r.flight
  37. maxdist = max(r.travelled for i, r in enumerate(reindeer))
  38. for r in reindeer:
  39. if r.travelled == maxdist:
  40. r.lead += 1
  41. return [r.lead for r in reindeer]
  42. reindeer = list(map(Reindeer.parse, sys.stdin))
  43. print(max(r.dist(2503) for r in reindeer))
  44. print(max(scores(reindeer, 2503)))