#!/usr/bin/env ruby def add(*x) x.sum end def mod(x,m) x.modulo(m) end P=5 B=7 T={} for p in 0...P for b in 0...B T[[p,b]]=mod(add(73,29*p,31*b,17*p*b,11*p*p,13*b*b),997) end end C={} C[[0,2]]=0 C[[0,5]]=1 C[[1,1]]=2 C[[1,6]]=3 C[[2,3]]=4 C[[3,4]]=5 C[[4,2]]=6 def j(a,b) return b if a==0 return a if b==0 return a if a==b return 3 end def jv(x,y) return (0...4).map{ j(x[_1],y[_1]) } end def cd(x) return add(x[0],4*x[1],16*x[2],64*x[3]) end def g(ctx) return 0 if ctx.length==0 return add(1,ctx[0]) if ctx.length==1 return add(8,7*ctx[0],ctx[1]) end E=Hash.new{ Array.new(4,0) } S=Hash.new{ Array.new(4,0) } E[[0,[]]]=[1,1,1,1] Z=0 H=0 for r in 1..5 sn=E.keys.select{ E[_1] != [0,0,0,0] }.sort_by{ [g(_1[1]),_1[0]] } for p,ctx in sn s=E[[p,ctx]].dup for b in 0...B t=T[[p,b]] u=mod(add(t,p,2*b),4) v=mod(add(2*t,p,b),4) w=mod(add(t,3*p,b),4) if !C.key?([p,b]) k=mod(t,4) if k==0 s[u]=2 elsif k==1 s[u]=1 elsif k==2 s[u]=j(s[u],s[v]) else s[u]=j(s[v],s[w]) Z=add(Z,1) if s[u]==2 or s[u]==3 end else c=C[[p,b]] q=mod(add(p,1,mod(t,4)),5) q=mod(add(q,1),5) if q==p if ctx.length==0 nctx=[c] elsif ctx.length==1 nctx=[ctx[0],c] else nctx=[ctx[1],c] end a=(0...4).map{ j(s[mod(add(_1,p,b),4)], add(1,mod(add(t,_1),2))) } E[[q,nctx]]=jv(E[[q,nctx]],a) sg=S[[q,nctx]] s[u]=j(s[u],sg[v]) s[w]=j(s[w],sg[mod(add(v,1),4)]) end H=mod(add(37*H,97*r,53*p,29*b,11*g(ctx),cd(s)),9973) end S[[p,ctx]]=jv(S[[p,ctx]],s) H=mod(add(37*H,97*r,53*p,11*g(ctx),5*cd(S[[p,ctx]])),9973) end puts 'end sweep' puts r puts Z puts H end K=E.keys.count{ E[_1] != [0,0,0,0] } puts 'ANSWER' puts Z puts H puts K