def f( s, I) :
if [ 0 ] > I:return [ ]
W= max ( map ( len , l:= s.split ( N:= '\n ' ) ) ) +1 ; s= [ *N.join ( i.ljust ( W-1 ) for i in l) +N*W] ; B= [ ( Q:= s.index ( '?' ) , I.pop ( 0 ) , 1 ) ] ; O= [ ] ; R= 999 ; L= [ -1 , -W, 1 , W]
while B*R:
C= [ ] ; R-= 1
for p, v, d in B:p+= d; z= L[ L.index ( d) -3 ] ; d= dict ( zip ( '<^>v+~\/ ' , L+[ z*2 *v-z, z, W//d, -W//d] ) ) .get ( c:= s[ p] , d) ; O+= [ v] *( c== '!' ) ; R*= c!= '@' ; s[ p] = [ c, ' ' ] [ c in '\/ ' ] ; C+= [ ( p, 1 -v, -d) ] *( c== '~' ) +[ ( p, v, d) ] *-~ -( c in '!?\n ' )
if I:C+= ( Q, I.pop ( 0 ) , 1 ) ,
B= C
return O
cat = """
?!
"""
truth = """
v ~
!+~
?^<
"""
negatefirst = """
? v
~ /
v! <
"""
takeuntil = """
?~
@+!
"""
null = """
>!
? +
~!
"""
assert f( cat, [ 1 , 1 , 0 , 0 , 1 , 1 , 0 ] ) == [ 1 , 1 , 0 , 0 , 1 , 1 , 0 ]
assert f( truth, [ 1 ] ) == [ 1 ] *249
assert f( truth, [ 0 ] ) == [ 0 ]
assert f( negatefirst, [ 1 , 1 , 0 , 0 , 1 , 1 , 0 ] ) == [ 0 , 1 , 0 , 0 , 1 , 1 , 0 ]
assert f( negatefirst, [ 0 , 1 , 1 , 0 , 1 , 0 , 1 ] ) == [ 1 , 1 , 1 , 0 , 1 , 0 , 1 ]
assert f( takeuntil, [ 1 ] ) == [ ]
assert f( takeuntil, [ 0 , 1 ] ) == [ 0 ]
assert f( takeuntil, [ 0 , 0 , 1 , 1 ] ) == [ 0 , 0 ]
assert f( takeuntil, [ 0 , 0 , 0 , 1 , 1 ] ) == [ 0 , 0 , 0 ]
assert f( null, [ 0 , 1 , 1 , 0 , 1 , 0 , 0 , 1 ] ) == [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ]
print ( 'All test cases passed!' )
ZGVmIGYocyxJKToKIGlmWzBdPkk6cmV0dXJuW10KIFc9bWF4KG1hcChsZW4sbDo9cy5zcGxpdChOOj0nXG4nKSkpKzE7cz1bKk4uam9pbihpLmxqdXN0KFctMSlmb3IgaSBpbiBsKStOKlddO0I9WyhROj1zLmluZGV4KCc/JyksSS5wb3AoMCksMSldO089W107Uj05OTk7TD1bLTEsLVcsMSxXXQogd2hpbGUgQipSOgogIEM9W107Ui09MQogIGZvciBwLHYsZCBpbiBCOnArPWQ7ej1MW0wuaW5kZXgoZCktM107ZD1kaWN0KHppcCgnPF4+dit+XC8nLEwrW3oqMip2LXoseixXLy9kLC1XLy9kXSkpLmdldChjOj1zW3BdLGQpO08rPVt2XSooYz09JyEnKTtSKj1jIT0nQCc7c1twXT1bYywnICddW2MgaW4nXC8nXTtDKz1bKHAsMS12LC1kKV0qKGM9PSd+JykrWyhwLHYsZCldKi1+LShjIGluJyE/XG4nKQogIGlmIEk6Qys9KFEsSS5wb3AoMCksMSksCiAgQj1DCiByZXR1cm4gTwogCmNhdCA9ICIiIgoKPyEKCiIiIgp0cnV0aCA9ICIiIgoKdiB+CiErfgo/XjwKCiIiIgpuZWdhdGVmaXJzdCA9ICIiIgoKPyAgdgogfiAvCnYhIDwKCiIiIgp0YWtldW50aWwgPSAiIiIKCj9+CkArIQoKIiIiCm51bGwgPSAiIiIKCiAgPiEKPyArCiAgfiEKCiIiIgoKYXNzZXJ0IGYoY2F0LCBbMSwxLDAsMCwxLDEsMF0pID09IFsxLCAxLCAwLCAwLCAxLCAxLCAwXQphc3NlcnQgZih0cnV0aCwgWzFdKSA9PSBbMV0qMjQ5CmFzc2VydCBmKHRydXRoLCBbMF0pID09IFswXQphc3NlcnQgZihuZWdhdGVmaXJzdCwgWzEsMSwwLDAsMSwxLDBdKSA9PSBbMCwxLDAsMCwxLDEsMF0KYXNzZXJ0IGYobmVnYXRlZmlyc3QsIFswLDEsMSwwLDEsMCwxXSkgPT0gWzEsMSwxLDAsMSwwLDFdCmFzc2VydCBmKHRha2V1bnRpbCwgWzFdKSA9PSBbXQphc3NlcnQgZih0YWtldW50aWwsIFswLDFdKSA9PSBbMF0KYXNzZXJ0IGYodGFrZXVudGlsLCBbMCwwLDEsMV0pID09IFswLDBdCmFzc2VydCBmKHRha2V1bnRpbCwgWzAsMCwwLDEsMV0pID09IFswLDAsMF0KYXNzZXJ0IGYobnVsbCwgWzAsMSwxLDAsMSwwLDAsMV0pID09IFswLDAsMCwwLDAsMCwwLDBdCgpwcmludCgnQWxsIHRlc3QgY2FzZXMgcGFzc2VkIScp