fork download
  1. f=\
  2. lambda b:next(C(b),0)!=0
  3. R,T,U=range,sorted,lambda x:''.join(map(str,x)).lstrip('0')
  4. Z=zip
  5. def C(b):
  6. q,S=[([],0)],[]
  7. while q:
  8. r,c=q.pop(0);L=len(b)
  9. if all(a==sum(j)for a,j in Z(b,Z(*r)))*r:yield r
  10. if c==L:1
  11. elif b[c]:
  12. for i in{*R(1,b[c]+1)}-{j for k in r for j in k}:
  13. for g in R(1,L+1):
  14. k=[0]*L;k[c]=i;I=1
  15. while I*g+c<L or c>=I*g:
  16. if c>=I*g:k[c-I*g]=i
  17. if I*g+c<L:k[I*g+c]=i
  18. I+=1
  19. if all(a>=sum(j)for a,j in Z(b,Z(*r+[k])))>any(all(j==K for j,K in Z(U(i),U(k)))for i in r)==(T(r+[k])in S):q+=(K:=r+[k],c+1),;S+=T(K),;q+=(b[c]>sum(j[c]for j in K))*[(K,c)]
  20. else:q+=(r,c+1),
  21.  
  22. print(f([0,1,1,0,1,1,0,1,1,0]))
  23. print(f([0,1,1]))
  24. print(f([1,1,2]))
  25. print(f([2,9,2,6,1]))
  26. #print(f([9,2,8,7,3,6,1,1]))
  27. #print(f([9,10,7,3,8,8,2,2])) Times out
  28. print('-'*20)
  29. print(f([9]))
  30. print(f([9,9]))
  31. print(f([9,9,9]))
  32. print(f([9,9,9,9]))
  33. print(f([0,3,3]))
  34. print(f([3,1,1]))
  35. print(f([0,3,3,0,3,3,0,3,3,0]))
  36. print(f([1,2,3,4,5,6,7,8]))
  37. #print(f([9,9,9,9,9,9,9,9,1]))
  38. #print(f([5,7,5,3,9,4,5,7]))
Success #stdin #stdout 0.7s 14160KB
stdin
Standard input is empty
stdout
False
False
False
False
--------------------
True
True
True
True
True
True
True
True