Solve 2020 day 13 CRT jojo

This commit is contained in:
2024-09-14 10:41:22 -04:00
parent 4a72eeb348
commit 6e588bb928
3 changed files with 56 additions and 1 deletions

39
2020/d13.py Normal file
View File

@@ -0,0 +1,39 @@
from lib import get_data, str_to_ints, mod_inverse
from functools import reduce
data = get_data(__file__)
lines = data.splitlines()
earliest = int(lines[0])
times = str_to_ints(lines[1])
mintime = 10**21
id = None
for time in times:
mintimecur = (earliest // time) * time + time
if mintimecur < mintime:
mintime = mintimecur
id = time
assert id is not None
print((mintime - earliest) * id)
fields = lines[1].split(",")
buses = []
for offset, busid in enumerate(fields):
if busid == "x":
continue
period = int(busid)
buses.append((period, -offset % period))
total = 0
product = reduce(lambda a, b: a * b, map(lambda x: x[0], buses))
for period, offset in buses:
p = product // period
total += offset * mod_inverse(p, period) * p
print(total % product)

View File

@@ -148,7 +148,8 @@ Solutions and utility script for Advent of Code challenges in Python.
- Day 10: 34:27 (so weak)
- Day 11: 21:05 (hmmm, I rally have to analyze why I am so slow)
- Day 12: 21:52 (just slow again for an easy problem)
- Day 13:
- Day 13: 18:00 (I don't really understand the CRT to be honest)
- Day 14:
## AoC 2022

15
lib.py
View File

@@ -280,3 +280,18 @@ def get_data(filename):
assert os.path.isfile(txt_file), "Could not download AoC file"
with open(txt_file) as f:
return f.read()
def mod_inverse(a, m):
def egcd(a, b):
if a == 0:
return b, 0, 1
else:
g, y, x = egcd(b % a, a)
return g, x - (b // a) * y, y
g, x, _ = egcd(a, m)
if g != 1:
raise Exception('Modular inverse does not exist')
else:
return x % m