13_shuttle.py 929 B

1234567891011121314151617181920212223242526272829303132
  1. #!/usr/bin/env python3
  2. import sys
  3. from functools import reduce
  4. from math import gcd
  5. def parse(f):
  6. yield int(next(f))
  7. yield list(map(int, next(f).replace('x', '0').split(',')))
  8. def earliest_bus(arrival, buses):
  9. wait, bus = min(((bus - arrival % bus) % bus, bus) for bus in buses if bus)
  10. return wait * bus
  11. def lcm(a, b):
  12. return abs(a * b) // gcd(a, b)
  13. def sync(buses):
  14. period, maxi = max((bus, i) for i, bus in enumerate(buses))
  15. diffs = [(i - maxi, bus) for i, bus in enumerate(buses) if bus]
  16. mindiff = diffs[0][0]
  17. t = 0
  18. while diffs:
  19. t += period
  20. synced = [bus for diff, bus in diffs if (t + diff) % bus == 0]
  21. if synced:
  22. period = reduce(lcm, [period] + synced)
  23. diffs = [(diff, bus) for diff, bus in diffs if bus not in synced]
  24. return t + mindiff
  25. arrival, buses = parse(sys.stdin)
  26. print(earliest_bus(arrival, buses))
  27. print(sync(buses))