#!/usr/local/bin/python3 from itertools import permutations as P,combinations as Q from collections import defaultdict as D W=sorted(set(P('0011223'))) def fd(w,u): a=[0]*(len(u)+1) a[0]=1 for ch in w: for j in range(len(u)-1,-1,-1): if ch==u[j]:a[j+1]+=a[j] return a[-1] def fc(w,u): s=0 for I in Q(range(7),len(u)): if all(w[I[j]]==u[j] for j in range(len(u))):s+=1 return s U=('01','12','23','012','123','0123') print('words',len(W),'bad',sum(fd(w,u)!=fc(w,u) for w in W for u in U)) def S(w):return tuple(fd(w,u) for u in U) G=D(list) for w in W:G[S(w)].append(w) L=list(G.values()) can=sorted(min(c) for c in L) def d(w):return sum(w[i]>w[i+1] for i in range(6)) def t(c):return 5*d(c)+sum((i+1)*(int(c[i])+2) for i in range(7)) big=[c for c in can if len(G[S(c)])>=3] cs=min((t(c),c) for c in big)[1] A=B=0 for r,c in enumerate(can,1): X=G[S(c)] b=sum(d(w)==2 for w in X) A+=r*(len(X)+2)*(b+3) B+=r*(sum((i+1)*(int(c[i])+3) for i in range(7))+5) Cv=sum((i+1)*(int(cs[i])+4) for i in range(7))*(fd(cs,'01')+2*fd(cs,'12')+3*fd(cs,'23')+5) idx={w:k for k,x in enumerate(L) for w in x} def rv(w):return tuple(reversed(w)) ex={} for k,x in enumerate(L): R={rv(w) for w in x} ks={idx[z] for z in R} if len(ks)==1 and len(L[list(ks)[0]])==len(R):ex[k]=list(ks)[0] print('N',len(L),'K',len(big),'hist',{k:sum(len(x)==k for x in L) for k in sorted(set(len(x) for x in L))}) print('Aexact',A,'Amod',A-101*(A//101),'Bexact',B,'Bmod',B-103*(B//103),'Cexact',Cv,'Cmod',Cv-107*(Cv//107)) print('star',''.join(cs),'theta',t(cs),'rank',can.index(cs)+1,'sig',S(cs),'size',len(G[S(cs)]),'b',sum(d(w)==2 for w in G[S(cs)])) print('M',len(ex),'fixed',sum(k==v for k,v in ex.items()),'J',len(ex)-sum(k==v for k,v in ex.items())) print('fixedclasses',[''.join(L[k][0]) for k,v in ex.items() if k==v])