#!/usr/local/bin/python3 from itertools import combinations, combinations_with_replacement from collections import Counter L=(1,2,3,4,6,7,8,9,10,11,12,13) def csums(ps): d={0:1} for v in ps: vv=v if v<=9 else 10 nd=dict(d) for s in list(d): key=sum((s,vv)) nd[key]=sum((nd.get(key,0),d[s])) d=nd return d def make_dist(xs): c=Counter({0:1}) for v in xs: vv=v if v<=9 else 10 p=Counter() for s in list(c): p[sum((s,vv))]=c[s] c.update(p) return c def seq2(ps): total=0 for ln in range(3,6): for idx in combinations(range(5),ln): a=sorted(ps[i] for i in idx) ok=len(set(a))==ln if ok: for j in range(1,ln): if a[j]!=sum((a[j-1],1)): ok=False if ok: left=a[0]-1 right=sum((a[-1],1)) if not any(p==left for p in ps): if not any(p==right for p in ps): total=sum((total,ln)) return total def seq3(ps): D=sorted(set(ps)) runs=[] start=None prev=None for v in D: if start is None: start=v elif v!=sum((prev,1)): runs.append((start,prev)) start=v prev=v if start is not None: runs.append((start,prev)) total=0 for a,b in runs: ln=len(range(a,sum((b,1)))) if ln>=3: ways=1 for lev in range(a,sum((b,1))): ways=ways*ps.count(lev) total=sum((total,ln*ways)) return total def main(): badcomb=0 firstcomb=None for a in combinations_with_replacement(range(1,11),5): d1=csums(a) d2=make_dist(a) for m in range(9,22): if d1.get(m,0)!=d2.get(m,0): badcomb=sum((badcomb,1)) if firstcomb is None: firstcomb=(a,m,d1.get(m,0),d2.get(m,0)) badseq=0 firstseq=None for H in combinations(L,4): for k in range(1,14): ps=(*H,k) s2=seq2(ps) s3=seq3(ps) if s2!=s3: badseq=sum((badseq,1)) if firstseq is None: firstseq=(ps,s2,s3) print('badcomb_all',badcomb,'firstcomb',firstcomb) print('badseq_all',badseq,'firstseq',firstseq) main()