import Data.List.Split (splitOn) import Data.Foldable (fold) data Coordinates = Coordinates Int Int Int deriving Show instance Semigroup Coordinates where Coordinates x y z <> Coordinates x' y' z' = Coordinates (x + x') (y + y') (z + z') instance Monoid Coordinates where mempty = Coordinates 0 0 0 getCoordinates :: String -> Coordinates getCoordinates direction = case direction of "n" -> Coordinates 1 0 0 "ne" -> Coordinates 0 1 0 "se" -> Coordinates 0 0 1 "s" -> Coordinates (-1) 0 0 "sw" -> Coordinates 0 (-1) 0 "nw" -> Coordinates 0 0 (-1) getDistance :: Coordinates -> Int getDistance (Coordinates x y z) = let absList = map abs [x, y, z] in sum absList - minimum absList main :: IO () main = do coordinates <- map getCoordinates . splitOn "," <$> readFile "11.txt" print $ getDistance $ fold coordinates print $ maximum . map getDistance . scanl mappend mempty $ coordinates