Add 2015 day 9

This commit is contained in:
Xavier Morel
2020-12-09 18:30:16 +01:00
parent 033691fd38
commit dd8f2ae9dc

View File

@@ -1,14 +1,35 @@
module Y2015.Day09 (y15day09) where
import qualified Data.Map as M
import Data.List
import Data.List.Split
parseInput :: String -> (String, String, Int)
parseInput input = (city1, city2, dist)
where (city1:split1:_) = splitOn " to " input
(city2:raw_dist:_) = splitOn " = " split1
dist = read $ raw_dist
parseInput input = parseInput' $ splitOn " " input
where parseInput' [c1, "to", c2, "=", d] = (c1, c2, read d)
getCities :: [(String, String, Int)] -> [String]
getCities input = nub $ cities
where cities = getCities' input
getCities' [] = []
getCities' ((c1, c2, _):next) = c1:c2:(getCities' next)
distanceToTuples :: (String, String, Int) -> [((String, String), Int)]
distanceToTuples (c1, c2, d) = [((c1, c2), d), ((c2, c1), d)]
computeTotalDistance :: M.Map (String, String) Int -> [String] -> Int
computeTotalDistance dists (c1:c2:next) = (dists M.! (c1, c2)) + computeTotalDistance dists (c2:next)
computeTotalDistance _ _ = 0
-- A bit naive implementation, but the low volume of cities (permutations) make it doable
y15day09 :: [String] -> (String, String)
y15day09 input = (part1, part2)
where part1 = show $ map parseInput input
part2 = "WIP"
where part1 = show $ minimum $ allDistances
part2 = show $ maximum $ allDistances
distances = map parseInput input
cities = getCities distances
distancesMap = M.fromList $ concatMap distanceToTuples distances
allPermutations = permutations $ cities
allDistances = map (computeTotalDistance distancesMap) $ allPermutations