fork download
  1. L=len
  2. def R(n,k):
  3. q=[(n,[])]
  4. for n,p in q:
  5. if(k==L(p))>n:yield tuple(sorted(p))
  6. elif k>L(p):
  7. for j in range(n):q+=(n+~j,p+[j+1]),
  8. def M(e,t,I,l):
  9. q=[(l,{*I},[])]
  10. for l,I,m in q:
  11. if l:q+=[(l[1:],I-{i},m+[(i,l[0])])for i in I if e[i]+l[0]<=t[i]]
  12. else:yield m
  13. def f(t):
  14. q,r=[([0]*L(t),[])],0
  15. for e,v in q:
  16. if e==t:r+=1
  17. elif l:=[i for i,a in enumerate(e)if a<t[i]]:
  18. i,*I=l
  19. for j in range(L(I)):
  20. for l in{*R(t[i]-e[i],j+1)}:
  21. for U in map(eval,{str(sorted(K))for K in M(e,t,I,[*l])}):
  22. E=[*e];E[i]=t[i]
  23. for x,y in U:E[x]+=y
  24. q+=(E,v+[(i,x,y)for x,y in U]),
  25. return r
  26.  
  27. import re
  28. s1 = """
  29. [6,2] | 0
  30. [5,3,2] | 1
  31. [3,3,1,1] | 3
  32. [4,3,1,1,1] | 6
  33. [4,2,1,1,1,1] | 10
  34. [1,1,1,1,1,1] | 15
  35. [3,2,2,2,1] | 15
  36. [2,2,2,2,2] | 22
  37. [7,6,5,4,3,2,1] | 7757
  38. """
  39. for i in filter(None, s1.split('\n')):
  40. a, b = re.split('\s+\|\s+', i)
  41. assert f(eval(a)) == int(b)
  42.  
  43. print('tests passed')
Success #stdin #stdout 0.19s 15512KB
stdin
Standard input is empty
stdout
tests passed