Day 9 - Part 2

Hope you have a fast machine. This is long to compute :)
This commit is contained in:
Martin Potier 2020-12-10 15:25:15 +02:00
parent 0305b145a7
commit 8d16541413
No known key found for this signature in database
GPG key ID: D4DD957DBA4AD89E

View file

@ -7,10 +7,13 @@
{-# OPTIONS_GHC -Wno-unused-top-binds -Wno-unused-imports #-} {-# OPTIONS_GHC -Wno-unused-top-binds -Wno-unused-imports #-}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
import Data.IntMap.Strict (IntMap)
import Data.IntSet (IntSet) import Data.IntSet (IntSet)
import Data.List (tails) import Data.List (inits, tails, sortOn)
import Data.Monoid
import Debug.Trace (trace) import Debug.Trace (trace)
import Text.Pretty.Simple import Text.Pretty.Simple
import qualified Data.IntMap.Strict as M
import qualified Data.IntSet as S import qualified Data.IntSet as S
@ -38,6 +41,23 @@ solvePart1 size message =
where where
go xs = (head $ drop size xs,isSumOfPreamble size xs) go xs = (head $ drop size xs,isSumOfPreamble size xs)
--------------------------------------------------------------------------------
sortedContiguousSubLists :: [Int] -> [[Int]]
sortedContiguousSubLists =
dropWhile (== []) . sortOn length . concat . fmap inits . tails
listSums :: [[Int]] -> IntMap [Int]
listSums xss = M.fromList $ do
xs <- xss
pure $ (getSum $ foldMap Sum xs, xs)
solvePart2 :: Int -> [Int] -> Int
solvePart2 target message = (\x -> minimum x + maximum x) $ bigMap M.! target
where
bigMap = listSums $ sortedContiguousSubLists message
main :: IO () main :: IO ()
main = do main = do
putStrLn "Test" putStrLn "Test"
@ -48,3 +68,8 @@ main = do
print $ solvePart1 5 exampleData print $ solvePart1 5 exampleData
input <- lines <$> readFile "day9/input" input <- lines <$> readFile "day9/input"
print $ solvePart1 25 $ map read input print $ solvePart1 25 $ map read input
putStrLn "Test"
print $ take 10 $ drop 20 $ sortedContiguousSubLists exampleData
putStrLn "Day 9 - Part 2"
print $ solvePart2 127 exampleData
print $ solvePart2 3199139634 $ map read input