fork download
  1. E=enumerate
  2. R=range
  3. X=max
  4. from itertools import*
  5. def C(l,L,H):
  6. q=[([a],[i])for i,a in E(l)if a<=L]
  7. while q:
  8. A,I=q.pop(0)
  9. if(L>=sum(A))*(H<1or sum(A)==L):yield(tuple(A),I)
  10. for i,a in E(l[X(I)+1:],X(I)+1):q+=[(T:=A+[a],I+[i])]*(sum(T)<=L)
  11. def P(b,l,Q,t):
  12. for i,a in E(b):
  13. if''in a:
  14. F=0;B,Y=eval(str(b)),[]
  15. for g in([[j for j,_ in b]for c,b in groupby(E(a),key=lambda x:x[1]=='')if c]):
  16. if(O:=[*C(l,len(g),t)]):
  17. F,d=1,{}
  18. for J,K in O:d[J]=K
  19. O=[*d.items()];M=X(sum(A)for A,_ in O);V,I=min([(o,p)for o,p in O if sum(o)==M],key=lambda x:len(x[0]));Y+=I
  20. for v in V:
  21. Q+=1
  22. for _ in R(v):B[i][g.pop(0)]=chr(Q)
  23. if F+t:return(B,[y for x,y in E(l)if~-(x in Y)],Q)
  24. def f(l):
  25. I=[1,X(l)][X(l)>10];Q=96
  26. while I:
  27. q=[(B:=[['']*I]*10,[*l],96)];S=[B]
  28. while q:
  29. b,L,Q=q.pop(0)
  30. if[]==L:return b
  31. if(C:=P(b,L,Q,1))and~-(C in S):q+=C,;S+=C,
  32. if(C:=P([*map(list,zip(*b))],L,Q,0)):
  33. B,L,Q=C;B=[*map(list,zip(*B))]
  34. if~-(B in S):q+=(B,L,Q),;S+=B,
  35. I+=1
  36.  
  37. print(f([8, 8, 8, 3]))
  38. print(f([2,2,4,2,2,4,4,4]))
  39. print(f([12,2,2,2,3,4,4,8,8]))
  40. print(f([4,4,4,4,4,4,4,4,4,4,4,4]))
  41. print(f([4,4,4,4,4,4,3,3,3,2,2,2,1]))
Success #stdin #stdout 0.22s 14128KB
stdin
Standard input is empty
stdout
[['a', 'a', 'a'], ['b', 'c', 'd'], ['b', 'c', 'd'], ['b', 'c', 'd'], ['b', 'c', 'd'], ['b', 'c', 'd'], ['b', 'c', 'd'], ['b', 'c', 'd'], ['b', 'c', 'd'], ['', '', '']]
[['a', 'd', 'g'], ['a', 'd', 'g'], ['b', 'e', 'h'], ['b', 'e', 'h'], ['b', 'e', ''], ['b', 'e', ''], ['c', 'f', ''], ['c', 'f', ''], ['c', 'f', ''], ['c', 'f', '']]
[['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'], ['b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c'], ['d', 'd', 'd', 'd', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e'], ['f', 'i', '', '', '', '', '', '', '', '', '', ''], ['f', 'i', '', '', '', '', '', '', '', '', '', ''], ['g', '', '', '', '', '', '', '', '', '', '', ''], ['g', '', '', '', '', '', '', '', '', '', '', ''], ['h', '', '', '', '', '', '', '', '', '', '', ''], ['h', '', '', '', '', '', '', '', '', '', '', ''], ['h', '', '', '', '', '', '', '', '', '', '', '']]
[['a', 'c', 'c', 'c', 'c'], ['a', 'd', 'd', 'd', 'd'], ['a', 'e', 'g', 'i', 'k'], ['a', 'e', 'g', 'i', 'k'], ['b', 'e', 'g', 'i', 'k'], ['b', 'e', 'g', 'i', 'k'], ['b', 'f', 'h', 'j', 'l'], ['b', 'f', 'h', 'j', 'l'], ['', 'f', 'h', 'j', 'l'], ['', 'f', 'h', 'j', 'l']]
[['a', 'd', 'g', 'j'], ['a', 'd', 'g', 'j'], ['a', 'd', 'g', 'j'], ['a', 'd', 'g', 'k'], ['b', 'e', 'h', 'k'], ['b', 'e', 'h', 'k'], ['b', 'e', 'h', 'l'], ['b', 'e', 'h', 'l'], ['c', 'f', 'i', 'l'], ['c', 'f', 'i', 'm']]