import itertools as I
E=enumerate
R=lambda x,n=4:{str(x),*R([i[::-1]for i in zip(*x)],n-1)}if n else set()
S=lambda t:{(x,y)for x,k in E(t)for y,p in E(k)if p}
G=lambda p,i,F=min:F(j[i]for j in p)
O=lambda j:{*R(m:=[[int((x,y)in j)for y in range(G(j,1,max)+1)]for x in range(G(j,0,max)+1)]),*R([i[::-1]for i in m])}
def P(b,n):
q=[(b,[],n)]
while q:
b,C,n=q.pop(0)
if not(n or b):yield C
if n and b:
for i,_ in E(b,1):
for c in I.combinations(b,i):
if 1==len(c)or all(any((j+J,k+K)in c for J,K in[(0,1),(0,-1),(1,0),(-1,0)])for j,k in c):q+=(b-{*c},C+[[(x-G(c,0),y-G(c,1))for x,y in c]],n-1),
def f(a,b):
c=0
while c:=c+1:
if any(all(O(J)&O(K)for J,K in zip(x,y))for x in P(S(a),c)for y in P(S(b),c)):return c
s1 = """
.....
.###.
.#.#.
.###.
.....
"""
s1_1 = """
###..
..#..
..#..
..###
.....
"""
s2="""
#...
##..
.#..
.##.
"""
s2_1="""
.##.
####
....
...."""
s3="""
#....#
######
"""
s3_1="""
.####.
.####."""
s4=""".###.
..#..
"""
s4_1=""".##..
.##.."""
s5="""##
#."""
s5_1="""
#.
##"""
s6="""#..
##.
.##"""
s6_1="""#####"""
def to_board(brd):
return [[int(k == '#') for k in i] for i in filter(None, brd.split('\n'))]
print(f(to_board(s1), to_board(s1_1)))
print(f(to_board(s2), to_board(s2_1)))
print(f(to_board(s3), to_board(s3_1)))
print(f(to_board(s4), to_board(s4_1)))
print(f(to_board(s5), to_board(s5_1)))
print(f(to_board(s6), to_board(s6_1)))
aW1wb3J0IGl0ZXJ0b29scyBhcyBJCkU9ZW51bWVyYXRlClI9bGFtYmRhIHgsbj00OntzdHIoeCksKlIoW2lbOjotMV1mb3IgaSBpbiB6aXAoKngpXSxuLTEpfWlmIG4gZWxzZSBzZXQoKQpTPWxhbWJkYSB0OnsoeCx5KWZvciB4LGsgaW4gRSh0KWZvciB5LHAgaW4gRShrKWlmIHB9Ckc9bGFtYmRhIHAsaSxGPW1pbjpGKGpbaV1mb3IgaiBpbiBwKQpPPWxhbWJkYSBqOnsqUihtOj1bW2ludCgoeCx5KWluIGopZm9yIHkgaW4gcmFuZ2UoRyhqLDEsbWF4KSsxKV1mb3IgeCBpbiByYW5nZShHKGosMCxtYXgpKzEpXSksKlIoW2lbOjotMV1mb3IgaSBpbiBtXSl9CmRlZiBQKGIsbik6CiBxPVsoYixbXSxuKV0KIHdoaWxlIHE6CiAgYixDLG49cS5wb3AoMCkKICBpZiBub3QobiBvciBiKTp5aWVsZCBDCiAgaWYgbiBhbmQgYjoKICAgZm9yIGksXyBpbiBFKGIsMSk6CiAgICBmb3IgYyBpbiBJLmNvbWJpbmF0aW9ucyhiLGkpOgogICAgIGlmIDE9PWxlbihjKW9yIGFsbChhbnkoKGorSixrK0spaW4gYyBmb3IgSixLIGluWygwLDEpLCgwLC0xKSwoMSwwKSwoLTEsMCldKWZvciBqLGsgaW4gYyk6cSs9KGIteypjfSxDK1tbKHgtRyhjLDApLHktRyhjLDEpKWZvciB4LHkgaW4gY11dLG4tMSksCmRlZiBmKGEsYik6CiBjPTAKIHdoaWxlIGM6PWMrMToKICBpZiBhbnkoYWxsKE8oSikmTyhLKWZvciBKLEsgaW4gemlwKHgseSkpZm9yIHggaW4gUChTKGEpLGMpZm9yIHkgaW4gUChTKGIpLGMpKTpyZXR1cm4gYwogIApzMSA9ICIiIgouLi4uLgouIyMjLgouIy4jLgouIyMjLgouLi4uLgoiIiIKczFfMSA9ICIiIgojIyMuLgouLiMuLgouLiMuLgouLiMjIwouLi4uLgoiIiIKczI9IiIiCiMuLi4KIyMuLgouIy4uCi4jIy4KIiIiCnMyXzE9IiIiCi4jIy4KIyMjIwouLi4uCi4uLi4iIiIKczM9IiIiCiMuLi4uIwojIyMjIyMKIiIiCnMzXzE9IiIiCi4jIyMjLgouIyMjIy4iIiIKCnM0PSIiIi4jIyMuCi4uIy4uCiIiIgpzNF8xPSIiIi4jIy4uCi4jIy4uIiIiCnM1PSIiIiMjCiMuIiIiCnM1XzE9IiIiCiMuCiMjIiIiCnM2PSIiIiMuLgojIy4KLiMjIiIiCnM2XzE9IiIiIyMjIyMiIiIKZGVmIHRvX2JvYXJkKGJyZCk6CglyZXR1cm4gW1tpbnQoayA9PSAnIycpIGZvciBrIGluIGldIGZvciBpIGluIGZpbHRlcihOb25lLCBicmQuc3BsaXQoJ1xuJykpXQoKCnByaW50KGYodG9fYm9hcmQoczEpLCB0b19ib2FyZChzMV8xKSkpCnByaW50KGYodG9fYm9hcmQoczIpLCB0b19ib2FyZChzMl8xKSkpCnByaW50KGYodG9fYm9hcmQoczMpLCB0b19ib2FyZChzM18xKSkpCnByaW50KGYodG9fYm9hcmQoczQpLCB0b19ib2FyZChzNF8xKSkpCnByaW50KGYodG9fYm9hcmQoczUpLCB0b19ib2FyZChzNV8xKSkpCnByaW50KGYodG9fYm9hcmQoczYpLCB0b19ib2FyZChzNl8xKSkp