import numpy as np from collections import defaultdict rng=np.random.default_rng(83) def fiber(cp,T,K): p=len(cp); d=[cp[t%p] for t in range(T+K+3)] e=[(1^d[t+1]) if d[t]==1 else int(rng.integers(2)) for t in range(T+K+2)] cols={0:d,1:e} for k in range(1,K+1): x,y=cols[k],cols[k-1]; cols[k+1]=[x[t+1]^(x[t]|y[t]) for t in range(len(x)-1)] return cols for cp in ((0,1,1),(0,1,1,1),(0,1,1,1,1),(0,1,1,1,1,1)): p=len(cp); K=20; T=60 table=defaultdict(set) for _ in range(600): c=fiber(cp,T,K) for k in range(2,19): for t in range(5,T-p): a=lambda kk,tt: c[kk][tt] Dk=a(k,t)^a(k,t+p); Dk1=a(k-1,t)^a(k-1,t+p) corr=(a(k,t)|a(k-1,t))^(a(k,t+p)|a(k-1,t+p)) table[(k,t%p,Dk1,Dk)].add(corr) pinned={} for k in range(2,19): cells=[key for key in table if key[0]==k and (key[2] or key[3])] # only situations where a difference is present det=[key for key in cells if len(table[key])==1] pinned[k]=f"{len(det)}/{len(cells)}" print(f"Mia {''.join(map(str,cp)):5s}: creation pinned (fixed by local differences, for every survivor), situations per lantern:") print(" "+" ".join(f"L{k}:{v}" for k,v in pinned.items()))