fork download
  1. L=len
  2. R=range
  3. v=lambda d:~d%2and d%3
  4. def C(B,x,X,y,Y):
  5. d={}
  6. for j in B[x:X]:
  7. for t in j[y:Y]:d[t]=d.get(t,0)+1
  8. return d
  9. def f(b):
  10. B=[b,b+[[0]*L(b[0])]][L(b)%2];e=[]
  11. for x in R(0,L(B),2):
  12. for y in R(0,L(B[0]),2):
  13. d=C(B,x,x+2,y,y+2);M=lambda x:d[x];V=[[-1,min(d,key=M)if~-L({*d.values()})else[*{0,1,2}-{*d}][0]][L(d)==2],max(d,key=M)][L(d)==3]
  14. if~V:
  15. for X in R(4):B[X//2+x][X%2+y]=V
  16. for x in R(L(B)):
  17. for y in R(L(B[0])):
  18. for X in R(x,L(B)):
  19. for Y in R(y,L(B[0])):
  20. if v(A:=~X+x)*v(U:=~Y+y):e+=(x,-~X,y,-~Y,A*U),
  21. q,s=[B],[B]
  22. for B in q:
  23. if L({i for k in B for i in k})==1:return B
  24. O=[]
  25. for I in e:
  26. if L(d:=C(B,*I[:-1]))==2*L({*d.values()})==2:O+=([*{0,1,2}-{*d}][0],*I),
  27. for V,x,X,y,Y,_ in sorted(O,key=lambda x:x[-1],reverse=1):
  28. T=eval(str(B))
  29. for j in R(x,X):
  30. for k in R(y,Y):T[j][k]=V
  31. if~-(T in s):q+=T,;s+=T,;break
  32.  
  33. s1 = """
  34. 12001020
  35. 01122202
  36. 01002010
  37. 20102020
  38. 11111010
  39. 02010102
  40. 10201020
  41. 12211201
  42. """
  43. def to_board(s):
  44. return [[*map(int, i)]for i in filter(None, s.split('\n'))]
  45.  
  46. print(f(to_board(s1)))
Success #stdin #stdout 1.99s 15604KB
stdin
Standard input is empty
stdout
[[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]]