fork download
  1. from itertools import*
  2. E=enumerate
  3. I,P,N=Z='| -'
  4. def f(b):
  5. V=[L:='+',*L.join(N*len(b[0])),L];U=[k for i in b for k in[V,[I,*I.join(P*len(i)),I]]]+[V];q=[S:={(x,y):v for x,r in E(U)for y,v in E(r)if v in Z}];M=dict(zip([i for i in q[0]if P==q[0][i]],[j for k in b for j in k]))
  6. for c in q:
  7. T,F=[],1
  8. for x,y,o in[(x,y,[X for X in[(x+1,y),(x-1,y),(x,y-1),(x,y+1)]])for x,y in c if P==S[(x,y)]]:z=M[(x,y)];T+=(z>(H:=sum(P==c[O]for O in o)))*[(x,y,o)];F*=z>=H
  9. if[]==T:
  10. for X,Y in c:U[X][Y]=c[(X,Y)]
  11. return'\n'.join(map(''.join,U))
  12. x,y,o=T[0]
  13. for t in combinations([X for X in o if(I!=c[X])<1<X[1]<len(U[0])-2or(N!=c[X])<1<X[0]<len(U)-2],M[(x,y)]-sum(P==c[O]for O in o)):q+=F*[{**c,**{i:P for i in t}}]
  14.  
  15. print(f([
  16. [0,1,0],
  17. [2,4,1],
  18. [1,1,0]
  19. ]))
  20. print('#'*30)
  21. print(f([
  22. [2,2,2,2,2],
  23. [2,1,3,1,2],
  24. [2,0,1,0,2],
  25. [2,2,2,2,2],
  26. ]))
  27. print('#'*30)
  28. print(f([
  29. [2,3,2,2],
  30. [2,1,1,1],
  31. [1,0,1,0],
  32. ]))
  33. print('#'*30)
  34. print(f([
  35. [1,1,1,1,1,1],
  36. [0,0,1,0,0,2],
  37. [0,0,0,1,2,2],
  38. ]))
Success #stdin #stdout 0.1s 14180KB
stdin
Standard input is empty
stdout
+-+-+-+
| | | |
+-+-+-+
|     |
+-+-+-+
| | | |
+-+-+-+
##############################
+-+-+-+-+-+
|   |     |
+-+-+-+-+-+
| | |   | |
+-+-+-+-+-+
| | | | | |
+-+-+-+-+-+
|         |
+-+-+-+-+-+
##############################
+-+-+-+-+
|       |
+-+-+-+-+
| | | | |
+-+-+-+-+
| | | | |
+-+-+-+-+
##############################
+-+-+-+-+-+-+
|   | |   | |
+-+-+-+-+-+-+
| | | | | | |
+-+-+-+-+-+-+
| | | |     |
+-+-+-+-+-+-+