Преглед изворни кода

Add alternative solution for 2020 day 13 based on Chinese Remainer Theorem (impl only works because bus IDs are primes)

Taddeus Kroes пре 5 година
родитељ
комит
24ab9385a2
1 измењених фајлова са 7 додато и 0 уклоњено
  1. 7 0
      2020/13_shuttle.py

+ 7 - 0
2020/13_shuttle.py

@@ -27,6 +27,13 @@ def sync(buses):
             diffs = [(diff, bus) for diff, bus in diffs if bus not in synced]
     return t + mindiff
 
+def sync_chinese_remainder(buses):
+    indices = [i for i, bus in enumerate(buses) if bus]
+    diff = indices[-1] - indices[0]
+    prod = reduce(lambda a, b: a * b, filter(None, buses))
+    return sum((diff - i) * pow(prod // n, n - 2, n) * prod // n
+               for i, n in enumerate(buses) if n) % prod - diff
+
 arrival, buses = parse(sys.stdin)
 print(earliest_bus(arrival, buses))
 print(sync(buses))