#!/usr/bin/env python3 from functools import lru_cache import random B={1:{2,5,8,9},2:{5,7,8},4:{1,2,5,7},5:{7,11},6:{1,2,4,5,8},7:{1,6,8},8:{4,5,9},9:{2,4,5,6,7},11:{1,2,4,6,7,8,9}} def w(a,u): return a if a==u else (10 if u==10 else u) if a==10 else (a if u==10 else (a if u in B.get(a,()) else u)) sp={11,1,2,4,5,6,7,8,9} @lru_cache(None) def O(c,l): if not l: return c if c in sp else 10 return w(O(c,l[1:]),O(l[0],l[1:])) C=[[w(a,u) for a in range(1,12)] for u in range(1,12)] I=[1,2,10,4,5,6,7,8,9,10,11] def vec(p): v=I for x in reversed(p): u=v[x-1] v=[C[u-1][a-1] for a in v] return v def full(cs,p): c1,c2,c3=cs return w(O(c1,(c3,)+p),O(c2,(c3,)+p)) random.seed(1) for t in range(200): p=tuple(random.sample(range(1,10),9)) v=vec(p) y=O(10,p) z=O(11,p) out=w(v[9],v[10]) if v[9]!=y or v[10]!=z or out!=w(y,z): print("BAD",p,v[9],v[10],out,y,z) break for cs in ((11,10,10),(10,11,10),(10,10,11),(11,10,10)): if full(cs,p)!=out: print("FULLBAD",cs,p,full(cs,p),out) break else: print("OK")