2015 Day 09 in Haskell
This commit is contained in:
parent
e46ff8585d
commit
931c038c43
28
2015/day09/day09.hs
Normal file
28
2015/day09/day09.hs
Normal file
@ -0,0 +1,28 @@
|
||||
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
|
17
aoc.hs
17
aoc.hs
@ -19,7 +19,7 @@ const' :: (a -> b) -> a -> c -> b
|
||||
const' f a _ = f a
|
||||
|
||||
enumerate :: [a] -> [(Int, a)]
|
||||
enumerate xs = zip [0..length xs] xs
|
||||
enumerate = zip [0..]
|
||||
|
||||
unimplemented :: Show p => p -> Int
|
||||
unimplemented = error . show
|
||||
@ -27,6 +27,9 @@ unimplemented = error . show
|
||||
pair :: [a] -> (a, a)
|
||||
pair as = let [a1, a2] = as in (a1, a2)
|
||||
|
||||
unpair :: (a, a) -> [a]
|
||||
unpair (a, b) = [a, b]
|
||||
|
||||
triplet :: [a] -> (a, a, a)
|
||||
triplet as = let [a1, a2, a3] = as in (a1, a2, a3)
|
||||
|
||||
@ -37,4 +40,14 @@ both :: (a -> b) -> (a, a) -> (b, b)
|
||||
both f (a, b) = (f a, f b)
|
||||
|
||||
lastSplit :: Int -> [a] -> ([a], [a])
|
||||
lastSplit n as = splitAt (length as - n) as
|
||||
lastSplit n as = splitAt (length as - n) as
|
||||
|
||||
remove :: Int -> [a] -> (a, [a])
|
||||
remove n xs = let (front, a:rest) = splitAt n xs in (a, front ++ rest)
|
||||
|
||||
permutations :: [a] -> [[a]]
|
||||
permutations [] = [[]]
|
||||
permutations xs = concatMap (\n -> let (a, rest) = remove n xs in map (a:) $ permutations rest) [0..length xs-1]
|
||||
|
||||
adjacents :: [a] -> [(a, a)]
|
||||
adjacents as = zip as $ tail as
|
Loading…
Reference in New Issue
Block a user