day 8
This commit is contained in:
parent
ce1a091cfc
commit
0168ffabbf
2 changed files with 81 additions and 0 deletions
20
08/example.txt
Normal file
20
08/example.txt
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
162,817,812
|
||||
57,618,57
|
||||
906,360,560
|
||||
592,479,940
|
||||
352,342,300
|
||||
466,668,158
|
||||
542,29,236
|
||||
431,825,988
|
||||
739,650,466
|
||||
52,470,668
|
||||
216,146,977
|
||||
819,987,18
|
||||
117,168,530
|
||||
805,96,715
|
||||
346,949,466
|
||||
970,615,88
|
||||
941,993,340
|
||||
862,61,35
|
||||
984,92,344
|
||||
425,690,689
|
||||
61
08/solution.hs
Normal file
61
08/solution.hs
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
import Debug.Trace
|
||||
import Data.List
|
||||
import Data.Maybe
|
||||
import Data.Graph
|
||||
|
||||
traceOut :: Show a => a -> a
|
||||
traceOut x = traceShow x x
|
||||
|
||||
(***) :: (a -> a') -> (b -> b') -> (a, b) -> (a', b')
|
||||
(f *** g) (x, y) = (f x, g y)
|
||||
|
||||
addFirst :: [[a]] -> a -> [[a]]
|
||||
addFirst [] x = [[x]]
|
||||
addFirst (y:ys) x = (x : y) : ys
|
||||
|
||||
split :: Eq a => [a] -> [a] -> [[a]]
|
||||
split _ [] = []
|
||||
split delims (x:xs)
|
||||
| x `elem` delims = [] : split delims xs
|
||||
| otherwise = addFirst (split delims xs) x
|
||||
|
||||
enumerate :: [a] -> [(Int, a)]
|
||||
enumerate = zip [0..]
|
||||
|
||||
take3 :: [a] -> Maybe (a, a, a)
|
||||
take3 (x:y:z:_) = Just (x, y, z)
|
||||
take3 _ = Nothing
|
||||
|
||||
fst3 :: (a,b,c) -> a
|
||||
fst3 (x,_,_) = x
|
||||
|
||||
parseFile :: String -> Maybe [(Int, Int, Int)]
|
||||
parseFile = sequence . map (take3 . map read . split [',']) . lines
|
||||
|
||||
distanceSq3 :: Num a => (a, a, a) -> (a, a, a) -> a
|
||||
distanceSq3 (x, y, z) (p, q, w) = (x-p)^2 + (y-q)^2 + (z-w)^2
|
||||
|
||||
cartesianProductNeq :: Eq a => [a] -> [a] -> [(a, a)]
|
||||
cartesianProductNeq xs ys = [(x, y) | x <- xs, y <- ys, x /= y]
|
||||
|
||||
solve1 :: [(Int, Int, Int)] -> Integer
|
||||
solve1 points = foldl (*) 1 $ take 3 $ sortOn negate $ map (toInteger . length) $ components graph
|
||||
where
|
||||
joins = take 2000 $ sortOn (uncurry distanceSq3) $ cartesianProductNeq points points
|
||||
(graph, vToNode, keyToV) = graphFromEdges $ map (\x -> (x, x, getJoins x)) points
|
||||
getJoins x = map fst $ filter ((==x) . snd) joins
|
||||
|
||||
solve2 :: Int -> [(Int, Int, Int)] -> Int
|
||||
solve2 k points = (uncurry (*)) $ (fst3 *** fst3) $ fst $ fromJust $ uncons $ reverse joins
|
||||
where
|
||||
joins = take (2*k) $ sortOn (uncurry distanceSq3) $ cartesianProductNeq points points
|
||||
(graph, vToNode, keyToV) = graphFromEdges $ map (\x -> (x, x, getJoins x)) points
|
||||
getJoins x = map fst $ filter ((==x) . snd) joins
|
||||
|
||||
main = do
|
||||
fileinp <- readFile "input.txt"
|
||||
let input = fromJust $ parseFile fileinp
|
||||
let solved1 = solve1 input
|
||||
let solved2 = solve2 7883 input -- found by manual binary search
|
||||
print solved1
|
||||
print solved2
|
||||
Loading…
Add table
Add a link
Reference in a new issue