Day 13
This commit is contained in:
parent
09f5a715aa
commit
b5f9c0ee1c
42
2020/day13.py
Normal file
42
2020/day13.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
import math
|
||||
import sys
|
||||
from functools import reduce
|
||||
from itertools import combinations
|
||||
|
||||
|
||||
def main():
|
||||
lines = [line.rstrip() for line in sys.stdin]
|
||||
earliest = int(lines[0])
|
||||
ids = map(int, filter(lambda s: s != "x", lines[1].split(",")))
|
||||
|
||||
# Part 1
|
||||
wait_times = {i: i - (earliest % i) for i in ids}
|
||||
best_id, wait = min(wait_times.items(), key=lambda item: item[1])
|
||||
print("Part 1:", best_id * wait)
|
||||
|
||||
# Part 2
|
||||
# math shit
|
||||
# https://en.wikipedia.org/wiki/Chinese_remainder_theorem wtf is going on
|
||||
ids = []
|
||||
rems = []
|
||||
for i, v in enumerate(lines[1].split(",")):
|
||||
if v != "x":
|
||||
# import hint: you want to use negative indices for remainders to
|
||||
# use it with CRT here.
|
||||
rems.append(-i)
|
||||
ids.append(int(v))
|
||||
# are all bus IDs co-prime?
|
||||
assert all(math.gcd(a, b) == 1 for a, b in combinations(ids, 2))
|
||||
# CRT
|
||||
# https://www.youtube.com/watch?v=zIFehsBHB8o
|
||||
N = reduce(lambda a, b: a * b, ids, 1)
|
||||
x = 0
|
||||
for ni, ai in zip(ids, rems):
|
||||
Ni = N // ni
|
||||
x += ai * Ni * pow(Ni, -1, ni)
|
||||
x %= N
|
||||
print("Part 2:", x)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in a new issue