You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

83 lines
2.1 KiB

#!/usr/bin/env python3
import sys, re
def memo(fc):
memo = {}
def f2(a,b,c,d,e,f,g):
if (a,b,c,d,e,f,g) not in memo: memo[(a,b,c,d,e,f,g)] = fc(a,b,c,d,e,f,g)
return memo[(a,b,c,d,e,f,g)]
return f2
def parse(line):
groups = re.compile(r"Player 1 starting position: (?P<p1>\d+)\nPlayer 2 starting position: (?P<p2>\d+)").search(line)
return groups
def step(p1,p2):
d,s1,s2,die,dr = 0,0,0,0,0
t = 1
while s1 < 1000 and s2 < 1000:
mv = d*3 + 6
d = d + 3 % 100
dr += 3
if t == 1:
p1 = (p1 + mv - 1) % 10 + 1
s1 += p1
if t == 2:
p2 = (p2 + mv - 1) % 10 + 1
s2 += p2
t = t%2+1
return dr*s2 if s2 < 1000 else dr*s1
@memo
def qstep(p1,p2,s1,s2,dv,t,dt):
if s1 >= 21:
return {1:1,2:0}
elif s2 >= 21:
return {1:0,2:1}
wins = {1: 0, 2: 0}
if t == 1:
if dt == 3:
nt = t%2+1
np1 = (p1 + dv - 1) % 10 + 1
ns1 = s1+np1
win = qstep(np1,p2,ns1,s2,0,nt,0)
wins[1] += win[1]
wins[2] += win[2]
else:
dt += 1
for d in range(1,4):
ndv = dv+d
win = qstep(p1,p2,s1,s2,ndv,t,dt)
wins[1] += win[1]
wins[2] += win[2]
if t == 2:
if dt == 3:
nt = t%2+1
np2 = (p2 + dv - 1) % 10 + 1
ns2 = s2+np2
win = qstep(p1,np2,s1,ns2,0,nt,0)
wins[1] += win[1]
wins[2] += win[2]
else:
dt += 1
for d in range(1,4):
ndv = dv+d
win = qstep(p1,p2,s1,s2,ndv,t,dt)
wins[1] += win[1]
wins[2] += win[2]
return wins
if __name__ == '__main__':
p1,p2 = map(int,parse(open(sys.argv[1]).read()).groups())
# challenge 1
res1 = str(step(p1,p2))
print("challenge 1:" + "\n" + res1 + "\n")
# challenge 2
results = qstep(p1,p2,0,0,0,1,0)
res2 = str(max(results.values()))
print("challenge 2:" + "\n" + res2 + "\n")