import numpy as np from collections import defaultdict w=10; pattern=(0,1); n=2*w+1; N=1<>j)&1 alive=np.ones(N,bool); death=np.full(N,T) for t in range(T): bad=alive&(X[:,off+w]!=pattern[t%2]); death[bad]=t; alive&=~bad X=np.roll(X,1,axis=1)^(X|np.roll(X,-1,axis=1)) bits=((idx[:,None]>>np.arange(n))&1).astype(bool) # position j -> cell j-w pos=np.arange(n)-w R=np.where(bits.any(1),np.max(np.where(bits,np.abs(pos),-1),axis=1),-1) gap=death-R # delay from removing the outermost lamp(s) outer_mask=np.zeros(N,dtype=np.int64) for j in range(n): outer_mask|=((np.abs(pos[j])==R)&bits[:,j]).astype(np.int64)<>j)&1) for s in rec[:2]] dl=[int(delay[np.searchsorted(idx,s)]) for s in rec[:2]] print(f"R={r:2d}: D={D:2d} | {cells} | delays {dl} | max delay {int(delay[sel].max())}")