python3 -c "def J(a,b): if a==0:return b if b==0:return a if a==b:return a return 3 def JJ(x,y):return tuple(J(a,b) for a,b in zip(x,y)) def G(g): if not g:return 0 if len(g)==1:return 1+g[0] return 8+7*g[0]+g[1] def C(x):return x[0]+4*x[1]+16*x[2]+64*x[3] def T(p,b):return (73+29*p+31*b+17*p*b+11*p*p+13*b*b)%997 calls={(0,2):0,(0,5):1,(1,1):2,(1,6):3,(2,3):4,(3,4):5,(4,2):6} Z=0;H=0;Z0=(0,0,0,0);E={(0,()):(1,1,1,1)};S={} for r in range(1,6): snap=sorted([k for k,v in E.items() if v!=Z0], key=lambda x:(G(x[1]),x[0])) print('SW',r,[(p,G(g),g,E[p,g]) for p,g in snap]) for p,g in snap: s=list(E[p,g]) for b in range(7): t=T(p,b);k=t%4;u=(t+p+2*b)%4;v=(2*t+p+b)%4;w=(t+3*p+b)%4 if (p,b) in calls: c=calls[p,b];q=(p+1+k)%5 if q==p:q=(q+1)%5 gp=(g+(c,))[-2:] a=tuple(J(s[(i+p+b)%4],1+((t+i)%2)) for i in range(4)) E[q,gp]=JJ(E.get((q,gp),Z0),a) ss=S.get((q,gp),Z0) s[u]=J(s[u],ss[v]);s[w]=J(s[w],ss[(v+1)%4]) else: 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] in (2,3):Z+=1 H=(37*H+97*r+53*p+29*b+11*G(g)+C(s))%9973 S[p,g]=JJ(S.get((p,g),Z0),tuple(s)) H=(37*H+97*r+53*p+11*G(g)+5*C(S[p,g]))%9973 print('P',p,g,tuple(s),S[p,g],Z,H) print('RES',(Z,H,len([1 for v in E.values() if v!=Z0])))"