import qualified Data.HashMap.Strict as HMS type DataMap = HMS.HashMap String (String, String) getDirection :: Char -> (a, a) -> a getDirection 'L' = fst getDirection 'R' = snd countTimes :: String -> DataMap -> Int countTimes directions m = countTimes' directions "AAA" 0 where countTimes' (d:ds) s n | s == "ZZZ" = n | otherwise = countTimes' ds (getDirection d $ m HMS.! s) (succ n) getDataMap :: [String] -> DataMap getDataMap = HMS.fromList . map parseLine where parseLine l = (take 3 l, (take 3 $ drop 7 l, take 3 $ drop 12 l)) main :: IO () main = do allLines <- lines <$> readFile "data.txt" let directions = cycle $ head allLines dataMap = getDataMap $ drop 2 allLines print $ countTimes directions dataMap