E=enumerate
def S(b,x,y):
for X,Y in[(x,y+1),(x,y-1),(x+1,y),(x-1,y)]:
try:
if X>-1<Y:yield(X,Y,b[X][Y])
except:1
def f(b):
a,s=[],[]
while o:=[(x,y,c)for x,t in E(b)for y,c in E(t)if(c in'XO')>((x,y,c)in s)]:
q,A=[o[0]],[]
while q:x,y,c=q.pop(0);A+=(x,y,c),;q+=[i for i in S(b,x,y)if(c==i[-1])>(i in A)]
a+=A,;s+=A
for i in a:
for x,y,_ in i:b[x][y]=str(len({k for X,Y,_ in i for k in S(b,X,Y)if'.'==k[-1]}))
return'\n'.join(map(' '.join,b)).replace('.','0')
def to_board(s):
return [[b for b in i if b != ' ']for i in filter(None, s.split('\n'))]
b1 = to_board(""". . O .
. X X .
. X . .
. O O .""")
b2 = to_board(""". X X .
X . X O
X X O .""")
b3 = to_board(""". X . O""")
b4 = to_board("""X
X
.
.
O
.""")
print(f(b1))
print('-'*20)
print(f(b3))
print('-'*20)
print(f(b4))
print('-'*20)
print(f(b2))
RT1lbnVtZXJhdGUKZGVmIFMoYix4LHkpOgogZm9yIFgsWSBpblsoeCx5KzEpLCh4LHktMSksKHgrMSx5KSwoeC0xLHkpXToKICB0cnk6CiAgIGlmIFg+LTE8WTp5aWVsZChYLFksYltYXVtZXSkKICBleGNlcHQ6MQpkZWYgZihiKToKIGEscz1bXSxbXQogd2hpbGUgbzo9Wyh4LHksYylmb3IgeCx0IGluIEUoYilmb3IgeSxjIGluIEUodClpZihjIGluJ1hPJyk+KCh4LHksYylpbiBzKV06CiAgcSxBPVtvWzBdXSxbXQogIHdoaWxlIHE6eCx5LGM9cS5wb3AoMCk7QSs9KHgseSxjKSw7cSs9W2kgZm9yIGkgaW4gUyhiLHgseSlpZihjPT1pWy0xXSk+KGkgaW4gQSldCiAgYSs9QSw7cys9QQogZm9yIGkgaW4gYToKICBmb3IgeCx5LF8gaW4gaTpiW3hdW3ldPXN0cihsZW4oe2sgZm9yIFgsWSxfIGluIGkgZm9yIGsgaW4gUyhiLFgsWSlpZicuJz09a1stMV19KSkKIHJldHVybidcbicuam9pbihtYXAoJyAnLmpvaW4sYikpLnJlcGxhY2UoJy4nLCcwJykKIApkZWYgdG9fYm9hcmQocyk6CglyZXR1cm4gW1tiIGZvciBiIGluIGkgaWYgYiAhPSAnICddZm9yIGkgaW4gZmlsdGVyKE5vbmUsIHMuc3BsaXQoJ1xuJykpXQoKYjEgPSB0b19ib2FyZCgiIiIuIC4gTyAuCi4gWCBYIC4KLiBYIC4gLgouIE8gTyAuIiIiKQpiMiA9IHRvX2JvYXJkKCIiIi4gWCBYIC4KWCAuIFggTwpYIFggTyAuIiIiKQpiMyA9IHRvX2JvYXJkKCIiIi4gWCAuIE8iIiIpCmI0ID0gdG9fYm9hcmQoIiIiWApYCi4KLgpPCi4iIiIpCnByaW50KGYoYjEpKQpwcmludCgnLScqMjApCnByaW50KGYoYjMpKQpwcmludCgnLScqMjApCnByaW50KGYoYjQpKQpwcmludCgnLScqMjApCnByaW50KGYoYjIpKQ==