2022-12-12 21:40:02 +01:00
import Data.List
import Data.Maybe
type Path = ( [ String ] , [ ( Int , Int ) ] )
main :: IO ()
main = do
2022-12-26 05:46:14 +01:00
input <- lines <$> readFile " input "
2022-12-12 21:40:02 +01:00
let s = findLetter 'S' input
2022-12-26 05:46:14 +01:00
let e = findLetter 'E' input
print $ step e ( input , [] ) [ s ]
2022-12-12 21:40:02 +01:00
findLetter :: Char -> [ String ] -> ( Int , Int )
findLetter c = f <*> fromJust . findIndex ( /= Nothing ) <$> map ( elemIndex c )
where
f x y = ( head $ catMaybes x , y )
2022-12-26 05:46:14 +01:00
step :: ( Int , Int ) -> Path -> [ ( Int , Int ) ] -> Int
step c ( field , visited ) active
| c ` elem ` active = 0
| otherwise = 1 + step c ( field , active ++ visited ) next
where next = nub $ sort $ concatMap ( nextSteps ( field , visited ) ) active
nextSteps :: Path -> ( Int , Int ) -> [ ( Int , Int ) ]
nextSteps ( field , visited ) ( x , y ) =
[ ( x + x' , y + y' )
| x' <- [ - 1 .. 1 ]
, x' + x >= 0
, x' + x < lenX
, y' <- [ - 1 .. 1 ]
, y' + y >= 0
, y + y' < lenY
, abs x' /= abs y'
, let a = field !! ( y + y' ) !! ( x + x' )
in ( a ` elem ` [ 'a' .. succ current ] || ( a == 'E' && current == 'z' ) )
, ( x + x' , y + y' ) ` notElem ` visited
]
2022-12-12 21:40:02 +01:00
where
lenX = length $ head field
lenY = length field
char = field !! y !! x
2022-12-26 05:46:14 +01:00
current
| char == 'S' = 'a'
| char == 'E' = 'z'
| otherwise = char