#!/bin/sh python3 <<'PY' from collections import defaultdict P=5 B=7 def A(*x):return sum(x) def M(x,m):return x-m*(x//m) T={} for p in range(P): for b in range(B): T[p,b]=M(A(73,29*p,31*b,17*p*b,11*p*p,13*b*b),997) C={(0,2):0,(0,5):1,(1,1):2,(1,6):3,(2,3):4,(3,4):5,(4,2):6} def J(a,b): if a==0:return b if b==0:return a if a==b:return a return 3 def JV(x,y):return tuple(J(x[i],y[i]) for i in range(4)) def cd(x):return A(x[0],4*x[1],16*x[2],64*x[3]) def G(g): if len(g)==0:return 0 if len(g)==1:return A(1,g[0]) return A(8,7*g[0],g[1]) E=defaultdict(lambda:(0,0,0,0)) S=defaultdict(lambda:(0,0,0,0)) E[0,()]=(1,1,1,1) Z=0 H=0 for r in range(1,6): sn=sorted([k for k in E if E[k]!=(0,0,0,0)],key=lambda k:(G(k[1]),k[0])) print('sweep',r,'snapshot',[(p,g,G(g)) for p,g in sn]) for p,g in sn: s=list(E[p,g]) for b in range(B): t=T[p,b] u=M(A(t,p,2*b),4) v=M(A(2*t,p,b),4) w=M(A(t,3*p,b),4) if (p,b) not in C: k=M(t,4) if k==0:s[u]=2 elif k==1:s[u]=1 elif k==2:s[u]=J(s[u],s[v]) else: s[u]=J(s[v],s[w]) if s[u]==2 or s[u]==3:Z=A(Z,1) else: c=C[p,b] q=M(A(p,1,M(t,4)),5) if q==p:q=M(A(q,1),5) if len(g)==0:gp=(c,) elif len(g)==1:gp=(g[0],c) else:gp=(g[1],c) a=tuple(J(s[M(A(i,p,b),4)],A(1,M(A(t,i),2))) for i in range(4)) E[q,gp]=JV(E[q,gp],a) sg=S[q,gp] print(' call',p,b,'g',g,'to',q,gp,'arg',a,'S',sg,'pre',tuple(s)) s[u]=J(s[u],sg[v]) s[w]=J(s[w],sg[M(A(v,1),4)]) H=M(A(37*H,97*r,53*p,29*b,11*G(g),cd(s)),9973) S[p,g]=JV(S[p,g],s) H=M(A(37*H,97*r,53*p,11*G(g),5*cd(S[p,g])),9973) print(' pair',p,g,'final s',tuple(s),'S',S[p,g],'Z',Z,'H',H) print('end sweep',r,'Z',Z,'H',H) K=sum(1 for k in E if E[k]!=(0,0,0,0)) print('ANSWER',Z,H,K) print('active',sorted([(p,g,G(g),E[p,g]) for p,g in E if E[p,g]!=(0,0,0,0)],key=lambda x:(x[2],x[0]))) PY