fork download
  1. E=enumerate
  2. def U(D,x,X):D[x]=D.get(x,[])+[X];D[X]=D.get(X,[])+[x]
  3. def f(b):
  4. m,W=[[0,1,'-^'],[1,0,'|>'],[0,-1,'-^'],[-1,0,'|>']],{'^':'-','>':'|'};x,y=[[x,y]for x,r in E(b)for y,t in E(r)if'$'==t][0];V=lambda X,Y:len(b)>X>-1<Y<len(b[0])and b[X][Y]!=' ';q,D=[(x,y,0,1-V(x,y+1))],{}
  5. while q:
  6. x,y,p,l=q.pop(0)
  7. if'#'==b[x][y]:return p
  8. if b[x][y]in'>^':
  9. for j,k,I in[(X,Y,i)for i,(X,Y,u)in E(m)if b[x][y]in u]+[(m[l][0],m[l][1],l)]:
  10. if((x+j,y+k)in D.get((x,y),[]))<((z:=b[x+j][y+k])in'>#^+'or z==W[b[x][y]]):U(D,(x,y),(x+j,y+k));q+=(x+j,y+k,p+1,I),;break
  11. elif'+'==b[x][y]:
  12. T,O=[0,1,2,3],[]
  13. for i in T[l:]+T[:l]:
  14. if V(X:=x+m[i][0],Y:=y+m[i][1])>((X,Y)in D.get((x,y),[])):
  15. if'#'==b[X][Y]:return-~p
  16. O+=((X,Y),i),
  17. if O:U(D,(x,y),O[0][0]);q+=(*O[0][0],p+1,O[0][1]),
  18. elif V(X:=x+m[l][0],Y:=y+m[l][1])and b[X][Y]in(m[l][2]+'#+'):U(D,(x,y),(X,Y));q+=(X,Y,p+1,l),
  19.  
  20. def to_board(d):
  21. return [[*i]for i in filter(None, d.split('\n'))]
  22.  
  23. s1 = """
  24. $
  25. |
  26. +-|
  27. #+-+
  28. """
  29. s2="""
  30. #-+-+
  31. | |
  32. $-^-+
  33. +-+
  34. """
  35. s3="""$#"""
  36.  
  37. s4="""
  38. #^^^^+
  39. >
  40. $----^-+
  41. > +
  42. +-+
  43. """
  44. s5="""
  45. $------+
  46. |-----+|
  47. --#--+|
  48. +--+---+
  49. +------+
  50. """
  51. s6 = """$ #"""
  52. s7 = """$|#"""
  53. s8="""
  54. $
  55. -
  56. #"""
  57. s9="""
  58. $|#
  59. |--|
  60. ++++
  61. """
  62. print(f(to_board(s1)))
  63. print(f(to_board(s2)))
  64. print(f(to_board(s3)))
  65. print(f(to_board(s4)))
  66. print(f(to_board(s5)))
  67. print(f(to_board(s6)))
  68. print(f(to_board(s7)))
  69. print(f(to_board(s8)))
  70. print(f(to_board(s9)))
Success #stdin #stdout 0.09s 14084KB
stdin
Standard input is empty
stdout
6
None
1
20
23
None
None
None
None