fork download
  1. e=enumerate;H,F='HF'
  2. def f(m):
  3. h=len(m)-1;w=len(q:=m[0])-1;o=0;n=lambda m,c,d:[[c if(k,l)in(g:=lambda c:{(k,l)for i,r in e(m)for j,v in e(r)for k in[i-1,i,i+1]for l in[j-1,j,j+1]if v==c and h>=k>-1<l<=w})(c)-g(d)else m[k][l]for(l,v)in e(r)]for(k,r)in e(m)];l=lambda:all(~-(H in r)for r in a)
  4. while a:=m:
  5. while~-(H in[q]+[a[h]]+[r[0]for r in a]+[r[w]for r in a]or l()):a=n(n(a,H,F),F,1)
  6. if l():return o
  7. else:
  8. o+=1;d=1
  9. for i in(0,h):
  10. for j,v in e(a[i]):
  11. if(v==H)*d:m[i][j+h//2]=F;d=0
  12. for j in(0,w):
  13. for i,v in e(r[j]for r in a):
  14. if(v==H)*d:m[i+w//2][j]=F;d=0
  15.  
  16. import pprint
  17.  
  18. examples=[
  19. """FFFFF
  20. F...F
  21. F.H.F
  22. F...F
  23. FFFFF""",
  24. """FFFFF
  25. F....
  26. F....
  27. F....
  28. F.H..
  29. F....
  30. F....
  31. F....
  32. FFFFF""",
  33. """.....
  34. .....
  35. ..H..
  36. .....
  37. ....."""]
  38.  
  39. for s in examples:
  40. m0 = [[v for(l,v)in e(r)]for(k,r)in e(s.split("\n"))] # splits string into a matrix
  41. pprint.pprint(m0)
  42. print(f(m0))
Success #stdin #stdout 0.3s 19448KB
stdin
Standard input is empty
stdout
[['F', 'F', 'F', 'F', 'F'],
 ['F', '.', '.', '.', 'F'],
 ['F', '.', 'H', '.', 'F'],
 ['F', '.', '.', '.', 'F'],
 ['F', 'F', 'F', 'F', 'F']]
0
[['F', 'F', 'F', 'F', 'F'],
 ['F', '.', '.', '.', '.'],
 ['F', '.', '.', '.', '.'],
 ['F', '.', '.', '.', '.'],
 ['F', '.', 'H', '.', '.'],
 ['F', '.', '.', '.', '.'],
 ['F', '.', '.', '.', '.'],
 ['F', '.', '.', '.', '.'],
 ['F', 'F', 'F', 'F', 'F']]
1
[['.', '.', '.', '.', '.'],
 ['.', '.', '.', '.', '.'],
 ['.', '.', 'H', '.', '.'],
 ['.', '.', '.', '.', '.'],
 ['.', '.', '.', '.', '.']]
2