From 81c974b56755f008f0bae33cbb2450492c4c5931 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 9 Dec 2020 18:10:55 +0000 Subject: [PATCH] Shorten 2020_09 --- hs/src/Aoc/Y2020/D09.hs | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/hs/src/Aoc/Y2020/D09.hs b/hs/src/Aoc/Y2020/D09.hs index f9e9e9c..21d64dc 100644 --- a/hs/src/Aoc/Y2020/D09.hs +++ b/hs/src/Aoc/Y2020/D09.hs @@ -1,16 +1,10 @@ -module Aoc.Y2020.D09 - ( day - ) where - -import Data.List +module Aoc.Y2020.D09 (day) where import Aoc.Day import Aoc.Parse +import Data.List -parser :: Parser [Int] -parser = manyLines decimal - -splitAndGroup :: Int -> [Int] -> [([Int], Int)] +splitAndGroup :: Int -> [a] -> [([a], a)] splitAndGroup width xs = case splitAt width xs of (_, []) -> [] (as, b:_) -> (as, b) : splitAndGroup width (drop 1 xs) @@ -18,22 +12,12 @@ splitAndGroup width xs = case splitAt width xs of isValid :: [Int] -> Int -> Bool isValid nums n = elem n $ (+) <$> nums <*> nums -continuousSubsequences :: [a] -> [[a]] -continuousSubsequences = filter (not . null) . concatMap tails . inits - findRanges :: Int -> [Int] -> [[Int]] -findRanges target = filter ((== target) . sum) . continuousSubsequences - -solver :: [Int] -> IO () -solver nums = do - putStrLn ">> Part 1" - let (_, invalidN) = head $ dropWhile (uncurry isValid) $ splitAndGroup 25 nums - print invalidN - - putStrLn "" - putStrLn ">> Part 2" - let weakness = head $ findRanges invalidN nums - print $ minimum weakness + maximum weakness +findRanges target = filter ((== target) . sum) . concatMap tails . inits day :: Day -day = dayParse parser solver +day = dayParse (manyLines decimal) $ \nums -> do + let (_, invalidN) = head $ dropWhile (uncurry isValid) $ splitAndGroup 25 nums + putStrLn $ ">> Part 1: " ++ show invalidN + let weakness = head $ findRanges invalidN nums + putStrLn $ ">> Part 2: " ++ show (minimum weakness + maximum weakness)