#!/usr/local/bin/python3 from itertools import combinations L=(1,2,3,4,6,7,8,9,10,11,12,13) KS=range(1,14) ORDER=(15,14,16,13,17,12,18,11,19,10,20,9,21) def vals(ps): return tuple((v if v<=9 else 10) for v in ps) def sums_of(ps): a=vals(ps) return [sum(c) for r in range(1,6) for c in combinations(a,r)] def seqpts(ps): D=set(ps) total=0 for a in range(1,14): for b in range(a,15): ln=b-a if ln>=3: if all(j in D for j in range(a,b)): if a==1 or (a-1) not in D: if b==14 or b not in D: ways=1 for j in range(a,b): ways=ways*ps.count(j) total=sum((total,ln*ways)) return total def profile(H): cnt=[0]*13 for k in KS: ss=sums_of((*H,k)) cs=[ss.count(m) for m in ORDER] best=max(cs) idx=cs.index(best) cnt[idx]=sum((cnt[idx],1)) return tuple(cnt) def targetscores(H,m): out=[] for k in KS: ps=(*H,k) ss=sums_of(ps) sc=sum((2*ss.count(m),seqpts(ps),(k in H)*2)) out.append(sc) return out def show(H): ts=targetscores(H,15) rng=max(ts)-min(ts) print('show',H,'profile',profile(H),'range',rng,'scores',ts,'sigma',sum(ts)) def main(): print('example_start') show((2,3,5,8)) print('example_end') tied=[] best=None for H in combinations(L,4): p=profile(H) if best is None or p>best: best=p tied=[H] elif p==best: tied.append(H) print('bestprofile',best) print('bestcount',len(tied)) print('bestfirst',tied[:20]) print('bestlast',tied[-20:]) rbest=None rt=[] for H in tied: ts=targetscores(H,15) r=max(ts)-min(ts) if rbest is None or r>rbest: rbest=r rt=[H] elif r==rbest: rt.append(H) print('maxrange',rbest) print('rangecount',len(rt)) print('rangetied',rt) cur=rt for level in range(1,14): withl=[H for H in cur if level in H] if len(withl)==1: cur=withl print('literalselected',level) break print('literalfinal',cur) cur2=rt for level in range(1,14): withl=[H for H in cur2 if level in H] if len(withl)>0: cur2=withl print('lexmaxfinal',cur2) print('finalstart') for H in cur: show(H) for H in cur2: if H not in cur: show(H) main()