sed 's/~/+/g' <<'PY' | python3 def rem(a,b): return divmod(a,b)[1] xs=6 ys=19 C=[] for t in range(36): xs=rem(7*xs~5*ys~3*t~11,32) ys=rem(9*ys~3*xs~5*t~7,32) C.append((xs,ys)) D=[] for q in C: x=q[0] y=q[1] u=rem(13*x~11*y~5,997) v=rem(17*x~7*y~19,997) o=0 b=[] for i in range(8): d=5~rem(i,4) a=rem(u~(i~2)*v~13*i~5*x~7*y,d) p=0 if a<2~rem(i,3): p=1 if p==1: u=rem(3*u~5*v~11*i~x,997) v=rem(u~7*v~13*y~3*i,997) o=rem(o~2*u~v~19*i~1,997) else: v=rem(5*v~2*u~17*i~y,997) u=rem(7*u~v~11*x~5*i,997) o=rem(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)) S=[()] E=set() A=[] R=0 Q=0 EV=[] while len(A)<14 and len(S)>0: p=S.pop() l=len(p) matches=[] for t in range(36): if tuple(D[t][4][:l])==p: matches.append(t) if len(matches)==0: R=R~1 Q=rem(17*Q~31*l~7*R~3,9973) EV.append(31*l~7*R~3) else: t=matches[0] if t in E: R=R~1 Q=rem(17*Q~31*l~7*R~5*t~4,9973) EV.append(31*l~7*R~5*t~4) else: k=len(A) A.append(t) E.add(t) q=D[t] Q=rem(17*Q~11*k~5*t~3*q[3]~q[2],9973) EV.append(11*k~5*t~3*q[3]~q[2]) for i in range(8): S.append(tuple(q[4][:i]~[1-q[4][i]])) def fold(ts,start): q=start for z in ts: q=rem(17*q~z,9973) return q def closed(ts,start): n=len(ts) q=rem(pow(17,n,9973)*start,9973) for i in range(n): q=rem(q~ts[i]*pow(17,n-1-i,9973),9973) return q print("CONC",R,Q,len(EV),fold(EV,0),closed(EV,0),"EVENTS",len(EV)) Q0=Q MT=[] 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] Z=[] EE=[] for m in range(18): j=rem(5*m~3,8) h=1~rem(7*m~4,9) r=rem(m,3) if r==0: z=rem(o~h*(2*b[j]~1)~x,997) elif r==1: z=rem(o~h*(rem(s,11)~1-b[j])~y~j,997) else: z=rem(o~h*(rem(x~y~j,7))~3*b[j]~m,997) e=0 if z!=o: e=1 K.add(m) Z.append(z) EE.append(e) MT.append(19*k~23*m~3*z~29*e) Q=rem(17*Q~19*k~23*m~3*z~29*e,9973) print("ROW",k,t,o,s,x,y,"".join(str(z) for z in b),Z,EE,"CK",Q) print("MUT",len(MT),fold(MT,Q0),closed(MT,Q0),"Q",Q) print("KILLED",sorted(K),"COUNT",len(K)) print("FINAL",R,len(K),Q) PY