sed 's/~/+/g' <<'PY' | python3 def md(a,b): return a-b*(a//b) xs=6 ys=19 C=[] for t in range(36): xs=md(7*xs~5*ys~3*t~11,32) ys=md(9*ys~3*xs~5*t~7,32) C.append((xs,ys)) D=[] for q in C: x=q[0] y=q[1] u=md(13*x~11*y~5,997) v=md(17*x~7*y~19,997) o=0 b=[] for i in range(8): d=5~md(i,4) a=md(u~(i~2)*v~13*i~5*x~7*y,d) p=0 if a<2~md(i,3): p=1 if p==1: u=md(3*u~5*v~11*i~x,997) v=md(u~7*v~13*y~3*i,997) o=md(o~2*u~v~19*i~1,997) else: v=md(5*v~2*u~17*i~y,997) u=md(7*u~v~11*x~5*i,997) o=md(o~u~3*v~23*i~4,997) b.append(p) s=0 for i in range(8): s=s~b[i]*(2**i) D.append((x,y,o,s,b)) print("CANDS",C) for t in range(36): q=D[t] print("P",t,q[0],q[1],q[2],q[3],"".join(str(z) for z in q[4])) S=[()] E=set() A=[] R=0 Q=0 while len(A)<14 and len(S)>0: p=S.pop() l=len(p) m=-1 for t in range(36): if tuple(D[t][4][:l])==p: m=t break if m==-1: R=R~1 Q=md(17*Q~31*l~7*R~3,9973) else: t=m if t in E: R=R~1 Q=md(17*Q~31*l~7*R~5*t~4,9973) else: k=len(A) A.append(t) E.add(t) q=D[t] Q=md(17*Q~11*k~5*t~3*q[3]~q[2],9973) for i in range(8): S.append(tuple(q[4][:i]~[1-q[4][i]])) print("ACCEPTED",A) print("RC",R,Q) K=set() for k in range(len(A)): t=A[k] q=D[t] x=q[0] y=q[1] o=q[2] s=q[3] b=q[4] for m in range(18): j=md(5*m~3,8) h=1~md(7*m~4,9) r=md(m,3) if r==0: z=md(o~h*(2*b[j]~1)~x,997) elif r==1: z=md(o~h*(md(s,11)~1-b[j])~y~j,997) else: z=md(o~h*(md(x~y~j,7))~3*b[j]~m,997) e=0 if z!=o: e=1 K.add(m) Q=md(17*Q~19*k~23*m~3*z~29*e,9973) print("KILLED",sorted(K)) print("FINAL",R,len(K),Q) PY