S=sum
W=lambda a,B,l,F=0:all(S(map(S,j))==1if F else S(map(S,j))<2for j in zip(*[[[i.pop(0)for _ in range(t)]for t in a]for i in[[*i]for i in B][:l]]))
def f(b):
q,s=[[1]],[]
for a in q:
if S(a)==len(b[0]):
Q=[[1]]
for A in Q:
X=[*b];C=[[X.pop(0)for _ in range(y)]for y in A]
if S(A)==len(b):
if all(W(a,B,len(B),1)for B in C):return 1
else:Q+=[A[:-1]+[A[-1]+1],A+[1]]*all(W(a,B,len(B))for B in C)
elif W(a,b,1):o=[p for p in[a[:-1]+[a[-1]+1],a+[1]]if~-(p in s)];q+=o;s+=o
s1 = """
00|0010|01|1
01|0000|00|0
00|0000|00|1
01|0010|01|0
01|1000|10|1
""".replace('|','')
def to_board(s):
return [[*map(int,j)]for j in filter(None, s.split('\n'))]
s = """
[[1]] -> True
[[0,1],[1,0]] -> True
[[1,1],[1,0]] -> False
[[1,0,1],[0,1,0]] -> True
[[1,0],[0,1],[0,1]] -> True
[[1,0,0],[0,0,1],[0,1,1]] -> True
[[1,1,1],[1,1,1],[1,1,1]] -> True
[[1,0,1],[0,1,0],[1,0,0]] -> True
[[1,0,0],[1,0,0],[0,1,1]] -> False
[[0,0,0,0,1],[1,0,0,1,0],[0,0,0,1,0]] -> False
[[0,0,1,0,1],[0,0,0,1,0],[0,0,0,0,0]] -> True
[[1,1,0,0,0],[0,0,0,0,0],[1,0,1,0,0]] -> True
[[1,1,0,1,1],[0,1,0,1,1],[1,0,0,0,0]] -> True
[[0,0,0,0,0,0,0],[0,1,1,1,0,1,0],[0,1,0,0,1,0,0],[0,0,0,0,0,0,1],[0,0,1,0,0,0,1],[1,1,0,1,1,0,0]] -> False
[[1,1,0,0,0,0,0],[1,0,1,1,0,1,0],[0,0,0,0,1,0,0],[0,1,0,1,1,0,0],[1,0,0,0,1,1,0],[0,0,0,0,0,1,0]] -> False
[[0,1,0,1,1,1,0],[0,0,0,0,1,0,0],[0,0,0,0,0,0,0],[1,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1]] -> True
[[0,1,0,0,1,0,1],[1,0,0,0,1,0,1],[0,0,1,0,1,0,1],[1,0,0,0,1,1,0],[0,0,0,1,1,1,0],[0,1,0,0,1,0,1]] -> True
[[0,1,0,0,1,0,0,1,0],[0,0,0,0,1,1,0,1,0],[1,1,0,0,1,0,0,0,0],[0,0,1,0,1,0,1,0,0],[0,0,1,0,1,0,1,0,0],[0,1,0,0,0,1,0,0,1],[0,1,0,0,0,0,1,0,0]] -> False
[[1,0,1,0,0,1,1,0,1],[0,1,1,0,0,1,1,0,1],[1,0,0,0,0,1,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,1,1],[0,1,1,0,1,0,1,0,1],[1,0,1,0,0,1,1,0,1]] -> True
"""
for i in filter(None, s.split('\n')):
a, b = map(eval, i.split(' -> '))
assert bool(f(a)) == bool(b)
print('Tests passed')
Uz1zdW0KVz1sYW1iZGEgYSxCLGwsRj0wOmFsbChTKG1hcChTLGopKT09MWlmIEYgZWxzZSBTKG1hcChTLGopKTwyZm9yIGogaW4gemlwKCpbW1tpLnBvcCgwKWZvciBfIGluIHJhbmdlKHQpXWZvciB0IGluIGFdZm9yIGkgaW5bWyppXWZvciBpIGluIEJdWzpsXV0pKQpkZWYgZihiKToKIHEscz1bWzFdXSxbXQogZm9yIGEgaW4gcToKICBpZiBTKGEpPT1sZW4oYlswXSk6CiAgIFE9W1sxXV0KICAgZm9yIEEgaW4gUToKICAgIFg9WypiXTtDPVtbWC5wb3AoMClmb3IgXyBpbiByYW5nZSh5KV1mb3IgeSBpbiBBXQogICAgaWYgUyhBKT09bGVuKGIpOgogICAgIGlmIGFsbChXKGEsQixsZW4oQiksMSlmb3IgQiBpbiBDKTpyZXR1cm4gMQogICAgZWxzZTpRKz1bQVs6LTFdK1tBWy0xXSsxXSxBK1sxXV0qYWxsKFcoYSxCLGxlbihCKSlmb3IgQiBpbiBDKQogIGVsaWYgVyhhLGIsMSk6bz1bcCBmb3IgcCBpblthWzotMV0rW2FbLTFdKzFdLGErWzFdXWlmfi0ocCBpbiBzKV07cSs9bztzKz1vCiAgCnMxID0gIiIiCjAwfDAwMTB8MDF8MQowMXwwMDAwfDAwfDAKMDB8MDAwMHwwMHwxCjAxfDAwMTB8MDF8MAowMXwxMDAwfDEwfDEKIiIiLnJlcGxhY2UoJ3wnLCcnKQoKZGVmIHRvX2JvYXJkKHMpOgoJcmV0dXJuIFtbKm1hcChpbnQsaildZm9yIGogaW4gZmlsdGVyKE5vbmUsIHMuc3BsaXQoJ1xuJykpXQoKcyA9ICIiIgpbWzFdXSAtPiBUcnVlCltbMCwxXSxbMSwwXV0gLT4gVHJ1ZQpbWzEsMV0sWzEsMF1dIC0+IEZhbHNlCltbMSwwLDFdLFswLDEsMF1dIC0+IFRydWUKW1sxLDBdLFswLDFdLFswLDFdXSAtPiBUcnVlCltbMSwwLDBdLFswLDAsMV0sWzAsMSwxXV0gLT4gVHJ1ZQpbWzEsMSwxXSxbMSwxLDFdLFsxLDEsMV1dIC0+IFRydWUKW1sxLDAsMV0sWzAsMSwwXSxbMSwwLDBdXSAtPiBUcnVlCltbMSwwLDBdLFsxLDAsMF0sWzAsMSwxXV0gLT4gRmFsc2UKW1swLDAsMCwwLDFdLFsxLDAsMCwxLDBdLFswLDAsMCwxLDBdXSAtPiBGYWxzZQpbWzAsMCwxLDAsMV0sWzAsMCwwLDEsMF0sWzAsMCwwLDAsMF1dIC0+IFRydWUKW1sxLDEsMCwwLDBdLFswLDAsMCwwLDBdLFsxLDAsMSwwLDBdXSAtPiBUcnVlCltbMSwxLDAsMSwxXSxbMCwxLDAsMSwxXSxbMSwwLDAsMCwwXV0gLT4gVHJ1ZQpbWzAsMCwwLDAsMCwwLDBdLFswLDEsMSwxLDAsMSwwXSxbMCwxLDAsMCwxLDAsMF0sWzAsMCwwLDAsMCwwLDFdLFswLDAsMSwwLDAsMCwxXSxbMSwxLDAsMSwxLDAsMF1dIC0+IEZhbHNlCltbMSwxLDAsMCwwLDAsMF0sWzEsMCwxLDEsMCwxLDBdLFswLDAsMCwwLDEsMCwwXSxbMCwxLDAsMSwxLDAsMF0sWzEsMCwwLDAsMSwxLDBdLFswLDAsMCwwLDAsMSwwXV0gLT4gRmFsc2UKW1swLDEsMCwxLDEsMSwwXSxbMCwwLDAsMCwxLDAsMF0sWzAsMCwwLDAsMCwwLDBdLFsxLDAsMCwxLDAsMCwwXSxbMCwwLDAsMCwwLDAsMF0sWzAsMCwwLDAsMCwwLDFdXSAtPiBUcnVlCltbMCwxLDAsMCwxLDAsMV0sWzEsMCwwLDAsMSwwLDFdLFswLDAsMSwwLDEsMCwxXSxbMSwwLDAsMCwxLDEsMF0sWzAsMCwwLDEsMSwxLDBdLFswLDEsMCwwLDEsMCwxXV0gLT4gVHJ1ZQpbWzAsMSwwLDAsMSwwLDAsMSwwXSxbMCwwLDAsMCwxLDEsMCwxLDBdLFsxLDEsMCwwLDEsMCwwLDAsMF0sWzAsMCwxLDAsMSwwLDEsMCwwXSxbMCwwLDEsMCwxLDAsMSwwLDBdLFswLDEsMCwwLDAsMSwwLDAsMV0sWzAsMSwwLDAsMCwwLDEsMCwwXV0gLT4gRmFsc2UKW1sxLDAsMSwwLDAsMSwxLDAsMV0sWzAsMSwxLDAsMCwxLDEsMCwxXSxbMSwwLDAsMCwwLDEsMCwwLDBdLFswLDAsMCwwLDAsMCwwLDAsMF0sWzAsMCwxLDAsMCwwLDAsMSwxXSxbMCwxLDEsMCwxLDAsMSwwLDFdLFsxLDAsMSwwLDAsMSwxLDAsMV1dIC0+IFRydWUKIiIiCmZvciBpIGluIGZpbHRlcihOb25lLCBzLnNwbGl0KCdcbicpKToKCWEsIGIgPSBtYXAoZXZhbCwgaS5zcGxpdCgnIC0+ICcpKQoJYXNzZXJ0IGJvb2woZihhKSkgPT0gYm9vbChiKQoKcHJpbnQoJ1Rlc3RzIHBhc3NlZCcp