def F( M, L, c) :y= M[ :M.index ( c) ] .count ( "\n " ) ; return L[ y] .index ( c) , y
def S( M) :
L= M.split ( "\n " ) ; Q= [ ( "" , ) +F( M, L, "S" ) +( 0 , ) ] ; D= { } ; R= range ; H= len ; U= R( 2 **30 )
while Q:
C, *Q= sorted ( Q, key= H) ; w, x, y, d= C
for e in R( H( L) > y> -1 < x< H( L[ y] ) > 0 < H( D.get ( C[ 1 :] , U) ) > H( w) and ( L[ y] [ x] in "+SE" ) *6 ) :D[ C[ 1 :] ] = w; E= ( d+e) %6 ; Q+= [ ( w+",R,RR,RRR,LL,L" .split ( "," ) [ e] +"F" , x+[ -1 , 1 , 2 , 1 , -1 , -2 ] [ E] , y+[ -1 , -1 , 0 , 1 , 1 , 0 ] [ E] , E) ]
J= min ( [ D.get ( F( M, L, "E" ) +( d, ) , U) for d in R( 6 ) ] , key= H) ; return [ J, "Invalid maze!" ] [ J== U]
print ( "Verifying" )
# Maze 1
assert S( """ 0 0 0 0
0 + 0 + 0
0 0 0 + + 0
0 + 0 + 0 + 0
0 0 + + 0 0 + 0
0 0 + 0 + 0 0 + 0
E 0 + 0 0 + + 0
+ + 0 + 0 + 0
0 0 0 0 0 +
+ 0 + + +
0 S 0 0""" ) == "RFRFFLFLFRFFLFFFLFLFFRFLFLFRFRFRF"
# Maze 2
assert S( """ + 0 0 0 0 0 0
0 0 0 0 0 + + 0
0 0 E 0 + 0 0 + 0
0 0 0 0 0 0 0 +
0 + 0 0 + + +
0 0 + + 0 0
S + 0 0 0""" ) == "Invalid maze!"
# Maze 3
assert S( """0 E S""" ) == "LF"
# Maze 4
assert S( """ E + 0
0 + + +
0 0 S
+ +""" ) == "FFLF"
# Maze 5
assert S( """ E
0 +
0 + +
0 +
S""" ) == "RFFLFF"
# Maze 6
assert S( """ 0 E + 0 0
0 + 0 0 + +
+ 0 + + + 0
+ 0 + 0 + 0
+ + + 0 S""" ) == "FFLFLFFRFRFFRFF"
# Maze 7
assert S( """ E 0 + + 0
0 + 0 + + 0
+ + + 0 + 0
+ 0 0 0 0 0
+ + + + 0
+ 0 S 0""" ) == "FLFFRFFRFLF"
print ( "Done" )
ZGVmIEYoTSxMLGMpOnk9TVs6TS5pbmRleChjKV0uY291bnQoIlxuIik7cmV0dXJuIExbeV0uaW5kZXgoYykseQpkZWYgUyhNKToKIEw9TS5zcGxpdCgiXG4iKTtRPVsoIiIsKStGKE0sTCwiUyIpKygwLCldO0Q9e307Uj1yYW5nZTtIPWxlbjtVPVIoMioqMzApCiB3aGlsZSBROgogIEMsKlE9c29ydGVkKFEsa2V5PUgpO3cseCx5LGQ9QwogIGZvciBlIGluIFIoSChMKT55Pi0xPHg8SChMW3ldKT4wPEgoRC5nZXQoQ1sxOl0sVSkpPkgodylhbmQoTFt5XVt4XWluIitTRSIpKjYpOkRbQ1sxOl1dPXc7RT0oZCtlKSU2O1ErPVsodysiLFIsUlIsUlJSLExMLEwiLnNwbGl0KCIsIilbZV0rIkYiLHgrWy0xLDEsMiwxLC0xLC0yXVtFXSx5K1stMSwtMSwwLDEsMSwwXVtFXSxFKV0KIEo9bWluKFtELmdldChGKE0sTCwiRSIpKyhkLCksVSlmb3IgZCBpbiBSKDYpXSxrZXk9SCk7cmV0dXJuW0osIkludmFsaWQgbWF6ZSEiXVtKPT1VXQogICAgICAgIApwcmludCgiVmVyaWZ5aW5nIikKIyBNYXplIDEKYXNzZXJ0IFMoIiIiICAgICAwIDAgMCAwCiAgICAwICsgMCArIDAKICAgMCAwIDAgKyArIDAKICAwICsgMCArIDAgKyAwCiAwIDAgKyArIDAgMCArIDAKMCAwICsgMCArIDAgMCArIDAKIEUgMCArIDAgMCArICsgMCAKICArICsgMCArIDAgKyAwCiAgIDAgMCAwIDAgMCArCiAgICArIDAgKyArICsKICAgICAwIFMgMCAwIiIiKSA9PSAiUkZSRkZMRkxGUkZGTEZGRkxGTEZGUkZMRkxGUkZSRlJGIgojIE1hemUgMgphc3NlcnQgUygiIiIgICsgMCAwIDAgMCAwIDAKIDAgMCAwIDAgMCArICsgMAowIDAgRSAwICsgMCAwICsgMAogMCAwIDAgMCAwIDAgMCArCiAgMCArIDAgMCArICsgKwogICAwIDAgKyArIDAgMAogICAgUyArIDAgMCAwIiIiKSA9PSAiSW52YWxpZCBtYXplISIKIyBNYXplIDMKYXNzZXJ0IFMoIiIiMCBFIFMiIiIpID09ICJMRiIKIyBNYXplIDQKYXNzZXJ0IFMoIiIiIEUgKyAwCjAgKyArICsKIDAgMCBTCiAgKyArIiIiKSA9PSAiRkZMRiIKIyBNYXplIDUKYXNzZXJ0IFMoIiIiICBFCiAwICsKMCArICsKIDAgKwogIFMiIiIpID09ICJSRkZMRkYiCiMgTWF6ZSA2CmFzc2VydCBTKCIiIiAwIEUgKyAwIDAKMCArIDAgMCArICsKICsgMCArICsgKyAwCiAgKyAwICsgMCArIDAKICAgKyArICsgMCBTIiIiKSA9PSAiRkZMRkxGRlJGUkZGUkZGIgojIE1hemUgNwphc3NlcnQgUygiIiIgRSAwICsgKyAwCjAgKyAwICsgKyAwCiArICsgKyAwICsgMAogICsgMCAwIDAgMCAwCiAgICsgKyArICsgMAogICAgKyAwIFMgMCIiIikgPT0gIkZMRkZSRkZSRkxGIgpwcmludCgiRG9uZSIpCg==