Files
aoc-in-haskell-2024/01/silver.hs
2024-12-02 01:15:23 +01:00

22 lines
636 B
Haskell

import Data.List -- sort
mapTuple :: (a -> b) -> (a, a) -> (b, b)
mapTuple f (a1, a2) = (f a1, f a2)
-- helper function for split
splitH :: [a] -> [a] -> [a] -> ([a], [a])
splitH ls rs (x:xs) = splitH rs (ls++[x]) xs
splitH ls rs _ = (ls, rs)
-- split: split list into two by alternating between left and right
split :: [a] -> ([a], [a])
split = splitH [] []
-- calculates the sum of the absolute distance between two lists
dist :: Int -> ([Int], [Int]) -> Int
dist acc (l:ls, r:rs) = dist (acc + abs (r - l)) (ls, rs)
dist acc _ = acc
main = interact $ show . dist 0 . mapTuple sort . split . map (read :: String -> Int) . words