import Aoc import Data.List ( nub ) import Data.Tuple ( swap ) import Control.Applicative ( (<|>) ) import Data.Maybe ( fromMaybe ) parseFile :: [String] -> [((String, String), Int)] parseFile = map (\line -> let [a, "to", b, "=", dist] = words line in ((a, b), read dist)) symLookup :: Eq a => (a, a) -> [((a,a), b)] -> Maybe b symLookup a ls = lookup a ls <|> lookup (swap a) ls process :: [((String, String), Int)] -> [Int] process connections = map (totalLength . adjacents) (permutations cities) where cities = nub $ concatMap (unpair . fst) connections totalLength = sum . map (fromMaybe undefined . (`symLookup` connections)) part1 :: [Int] -> Int part1 = minimum part2 :: [Int] -> Int part2 = maximum main = aocMain (process . parseFile) part1 part2