fork download
  1. def f(s,I):
  2. if[0]>I:return[]
  3. 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]
  4. while B*R:
  5. C=[];R-=1
  6. 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')
  7. if I:C+=(Q,I.pop(0),1),
  8. B=C
  9. return O
  10.  
  11. cat = """
  12.  
  13. ?!
  14.  
  15. """
  16. truth = """
  17.  
  18. v ~
  19. !+~
  20. ?^<
  21.  
  22. """
  23. negatefirst = """
  24.  
  25. ? v
  26. ~ /
  27. v! <
  28.  
  29. """
  30. takeuntil = """
  31.  
  32. ?~
  33. @+!
  34.  
  35. """
  36. null = """
  37.  
  38. >!
  39. ? +
  40. ~!
  41.  
  42. """
  43.  
  44. assert f(cat, [1,1,0,0,1,1,0]) == [1, 1, 0, 0, 1, 1, 0]
  45. assert f(truth, [1]) == [1]*249
  46. assert f(truth, [0]) == [0]
  47. assert f(negatefirst, [1,1,0,0,1,1,0]) == [0,1,0,0,1,1,0]
  48. assert f(negatefirst, [0,1,1,0,1,0,1]) == [1,1,1,0,1,0,1]
  49. assert f(takeuntil, [1]) == []
  50. assert f(takeuntil, [0,1]) == [0]
  51. assert f(takeuntil, [0,0,1,1]) == [0,0]
  52. assert f(takeuntil, [0,0,0,1,1]) == [0,0,0]
  53. assert f(null, [0,1,1,0,1,0,0,1]) == [0,0,0,0,0,0,0,0]
  54.  
  55. print('All test cases passed!')
Success #stdin #stdout 0.09s 14048KB
stdin
Standard input is empty
stdout
All test cases passed!