e=enumerate;H,F='HF' def f(m): 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) while a:=m: 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) if l():return o else: o+=1;d=1 for i in(0,h): for j,v in e(a[i]): if(v==H)*d:m[i][j+h//2]=F;d=0 for j in(0,w): for i,v in e(r[j]for r in a): if(v==H)*d:m[i+w//2][j]=F;d=0 import pprint examples=[ """FFFFF F...F F.H.F F...F FFFFF""", """FFFFF F.... F.... F.... F.H.. F.... F.... F.... FFFFF""", """..... ..... ..H.. ..... ....."""] for s in examples: m0 = [[v for(l,v)in e(r)]for(k,r)in e(s.split("\n"))] # splits string into a matrix pprint.pprint(m0) print(f(m0))
Standard input is empty
[['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