node -e 'function J(a,b){if(a===0)return b;if(b===0)return a;if(a===b)return a;return 3} function JJ(x,y){return x.map((a,i)=>J(a,y[i]))} function G(g){return g.length===0?0:g.length===1?1+g[0]:8+7*g[0]+g[1]} function C(x){return x[0]+4*x[1]+16*x[2]+64*x[3]} function T(p,b){return (73+29*p+31*b+17*p*b+11*p*p+13*b*b)%997} const calls=new Map();calls.set("0,2",0);calls.set("0,5",1);calls.set("1,1",2);calls.set("1,6",3);calls.set("2,3",4);calls.set("3,4",5);calls.set("4,2",6); let E=new Map(),S=new Map();E.set("0|",[1,1,1,1]); let Z=0,H=0;const Z0=[0,0,0,0]; function get(M,k){return M.has(k)?M.get(k):Z0.slice()} for(let r=1;r<=5;r++){ let snap=[];for(const [k,v] of E){if(v.some(x=>x!==0)){const q=k.split("|");const p=+q[0];const g=q[1]?q[1].split(",").map(Number):[];snap.push({p,g,k})}} snap.sort((a,b)=>G(a.g)-G(b.g)||a.p-b.p); console.log("SW",r,JSON.stringify(snap.map(x=>[x.p,G(x.g),x.g,E.get(x.k)]))); for(const o of snap){const p=o.p,g=o.g,key=o.k;let s=E.get(key).slice(); for(let b=0;b<7;b++){const 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(calls.has(p+","+b)){const c=calls.get(p+","+b);let q=(p+1+k)%5;if(q===p)q=(q+1)%5;const gp=g.concat([c]).slice(-2),gk=q+"|"+gp.join(","); const a=[0,1,2,3].map(i=>J(s[(i+p+b)%4],1+((t+i)%2)));E.set(gk,JJ(get(E,gk),a));const ss=get(S,gk);s[u]=J(s[u],ss[v]);s[w]=J(s[w],ss[(v+1)%4])} else{if(k===0)s[u]=2;else if(k===1)s[u]=1;else if(k===2)s[u]=J(s[u],s[v]);else{s[u]=J(s[v],s[w]);if(s[u]===2||s[u]===3)Z++}} H=(37*H+97*r+53*p+29*b+11*G(g)+C(s))%9973;} S.set(key,JJ(get(S,key),s));H=(37*H+97*r+53*p+11*G(g)+5*C(S.get(key)))%9973; console.log("P",p,g.join(","),JSON.stringify(s),JSON.stringify(S.get(key)),Z,H);}} let K=0;for(const v of E.values())if(v.some(x=>x!==0))K++; console.log("RES",Z,H,K);'