import numpy as np, time def gap(w,pattern,T): n=2*w+1; N=1<>j)&1 X=X[(idx & 1)|(idx>>(n-1))&1 >0] if False else X alive=np.ones(N,bool); last=np.full(N,-1) for t in range(T): c=X[:,off+w] ok=(c==pattern[t%len(pattern)]) newly=alive&~ok; last[newly]=t-1; alive&=ok if not alive.any(): break l=np.roll(X,1,axis=1); r=np.roll(X,-1,axis=1); X=l^(X|r) last[alive]=T nz=idx!=0 return int(last[nz].max()) t0=time.time() for pat in ((0,1),(1,0)): row=[] for w in range(1,11): g=gap(w,pat,4*w+20) row.append(f"w={w}: {g} ({g-w:+d})") if time.time()-t0>200: break print(f"centre pattern {''.join(map(str,pat))}...: longest match (steps past width): "+" ".join(row))