Solve 2019 day 23
This commit is contained in:
22
2019/d22.py
22
2019/d22.py
@@ -9,12 +9,12 @@ for line in data.splitlines():
|
||||
if "new stack" in line:
|
||||
deck = list(reversed(deck))
|
||||
elif "cut" in line:
|
||||
n, = str_to_ints(line)
|
||||
(n,) = str_to_ints(line)
|
||||
deck = deck[n:] + deck[:n]
|
||||
elif "increment" in line:
|
||||
new_deck = [-1] * len(deck)
|
||||
pos = 0
|
||||
n, = str_to_ints(line)
|
||||
(n,) = str_to_ints(line)
|
||||
deck = list(reversed(deck))
|
||||
while deck:
|
||||
new_deck[pos] = deck.pop()
|
||||
@@ -37,7 +37,7 @@ for line in data.splitlines():
|
||||
assert rev_index == index
|
||||
index = new_index
|
||||
elif "cut" in line:
|
||||
cut, = str_to_ints(line)
|
||||
(cut,) = str_to_ints(line)
|
||||
cut = (len + cut) % len
|
||||
if index >= cut:
|
||||
new_index = index - cut
|
||||
@@ -48,7 +48,7 @@ for line in data.splitlines():
|
||||
index = new_index
|
||||
# calculate index from new_index and store in rev_index
|
||||
elif "increment" in line:
|
||||
n, = str_to_ints(line)
|
||||
(n,) = str_to_ints(line)
|
||||
assert gcd(n, len) == 1
|
||||
new_index = (n * index) % len
|
||||
m = mod_inverse(n, len)
|
||||
@@ -63,11 +63,11 @@ for line in reversed(data.splitlines()):
|
||||
if "new stack" in line:
|
||||
index = -(index - len + 1)
|
||||
elif "cut" in line:
|
||||
cut, = str_to_ints(line)
|
||||
(cut,) = str_to_ints(line)
|
||||
cut = (len + cut) % len
|
||||
index = (index + cut) % len
|
||||
elif "increment" in line:
|
||||
n, = str_to_ints(line)
|
||||
(n,) = str_to_ints(line)
|
||||
assert gcd(n, len) == 1
|
||||
m = mod_inverse(n, len)
|
||||
index = (index * m) % len
|
||||
@@ -80,6 +80,7 @@ len = 119315717514047
|
||||
|
||||
# get expression for one loop using sympy
|
||||
from sympy import symbols, simplify
|
||||
|
||||
index = symbols("index")
|
||||
expr = index
|
||||
for line in lines:
|
||||
@@ -87,16 +88,16 @@ for line in lines:
|
||||
# index = -(index - len + 1)
|
||||
expr = -(expr - len + 1)
|
||||
elif "cut" in line:
|
||||
cut, = str_to_ints(line)
|
||||
(cut,) = str_to_ints(line)
|
||||
cut = (len + cut) % len
|
||||
# index = (index + cut) % len
|
||||
expr = (expr + cut)
|
||||
expr = expr + cut
|
||||
elif "increment" in line:
|
||||
n, = str_to_ints(line)
|
||||
(n,) = str_to_ints(line)
|
||||
assert gcd(n, len) == 1
|
||||
m = mod_inverse(n, len)
|
||||
# index = (index * m) % len
|
||||
expr = (expr * m)
|
||||
expr = expr * m
|
||||
|
||||
# we can see that expression is in the form (a - b * i) % m
|
||||
expr = simplify(expr % len)
|
||||
@@ -115,4 +116,3 @@ term1 = (p_t * r0) % m
|
||||
term2 = (a * (1 - p_t) * inv_b1) % m
|
||||
r_t = (term1 + term2) % m
|
||||
print(r_t)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user