import Data.List.Split import Data.List import qualified Data.Set as Set import Data.Maybe import Linear.V2 main = do content <- readFile "input" let [trace1, trace2] = map gensteps $ parse content print (day3a trace1 trace2) print (day3b trace1 trace2) parse :: String -> [[(Char,Int)]] parse = map (map (\x->(head x,read $ tail x))) . map (splitOn ",") . lines gensteps :: [(Char,Int)] -> [V2 Int] gensteps = scanl1 (+) . concatMap (\(x,y)->replicate y $ step x) step :: Char -> V2 Int step x | x=='U'=V2 0 1 | x=='R'=V2 1 0 | x=='D'=V2 0 (-1) | x=='L'=V2 (-1) 0 day3a :: [V2 Int] -> [V2 Int] -> Int day3a xs ys = Set.findMin $ Set.map manhattan $ (Set.fromList xs) `Set.intersection` (Set.fromList ys) where manhattan (V2 x y) = abs x + abs y day3b xs ys = minimum [let f = succ . fromJust . elemIndex x in f xs + f ys | x<-Set.toList $ (Set.fromList xs) `Set.intersection` (Set.fromList ys)]