fork download
  1. E=enumerate
  2. def f(p,s):
  3. b=[*map(list,p.split('\n'))];x,y=[(x,y)for x,a in E(b)for y,c in E(a)if'?'==c][0];v=(0,1);z=(-1,0);u=(1,0);w=(0,-1);q,C,s,D=[(x,y,0,1,a,[(x,y)],i)for i,a in E(s)],[],[],{v:[z,u],w:[u,z],z:[w,v],u:[v,w]}
  4. while q:
  5. x,y,X,Y,B,p,I=q.pop(0)
  6. if~-((p,I)in s)*(len(b)>(x:=x+X)>-1<(y:=y+Y)<len(b[0])):
  7. s+=(p,I),
  8. if(O:=b[x][y])in(L:={'>':v,'<':w,'v':u,'^':z}):q+=(x,y,*L[O],B,p+[(x,y)],I),
  9. if'+'==O:q+=(x,y,*D[(X,Y)][B],B,p+[(x,y)],I),
  10. if O in'\\/':q+=(x,y,Y*(X<1),[1,-1][X==1]*(X>0),B,p+[(x,y)],I),;b[x][y]=' '
  11. if'~'==O:
  12. for t in[0,1]:q+=(x,y,*D[(X,Y)][t],[1>B,B][t],[(x,y)],I),
  13. if'!'==O:C+=int(B),
  14. if'@'==O:q=[]
  15. if' '==O:q+=(x,y,X,Y,B,p+[(x,y)],I),
  16. return C
  17.  
  18. print(f("""?!""",[1,1,0,0,1,1,0]))
  19. print(f("""v ~
  20. !+~
  21. ?^<""",[1,1,0,0,1,1,0]))
  22. print(f("""? v
  23. ~ /
  24. >! <""",[1,1,0,0,1,1,0]))
  25. print(f("""? v
  26. ~ /
  27. >! <""",[0,1,1]))
  28. print(f("""?~
  29. @+!""",[1]))
  30. print(f("""?~
  31. @+!""",[0,1,1]))
  32. print(f("""?~
  33. @+!""",[0,0,1,1]))
  34. print(f("""?~
  35. @+!""",[0,0,0,1,1]))
Success #stdin #stdout 0.09s 14092KB
stdin
Standard input is empty
stdout
[1, 1, 0, 0, 1, 1, 0]
[0, 0, 0, 1, 1, 1, 1]
[0, 1, 0, 0, 1, 1, 0]
[1, 1, 1]
[]
[0]
[0, 0]
[0, 0, 0]