diff options
author | Julien Dessaux | 2023-03-17 23:36:44 +0100 |
---|---|---|
committer | Julien Dessaux | 2023-03-17 23:36:44 +0100 |
commit | d7756f372421bdc4b4239f31503dda1b9d1fe275 (patch) | |
tree | bf88dbadaef2bd0d62ba302ad273365ed413c8c3 /2020/09-Encoding_Error/second.hs | |
parent | 2020-08 in haskell (diff) | |
download | advent-of-code-d7756f372421bdc4b4239f31503dda1b9d1fe275.tar.gz advent-of-code-d7756f372421bdc4b4239f31503dda1b9d1fe275.tar.bz2 advent-of-code-d7756f372421bdc4b4239f31503dda1b9d1fe275.zip |
2020-09 in haskell
Diffstat (limited to '2020/09-Encoding_Error/second.hs')
-rw-r--r-- | 2020/09-Encoding_Error/second.hs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/2020/09-Encoding_Error/second.hs b/2020/09-Encoding_Error/second.hs new file mode 100644 index 0000000..d9d3a62 --- /dev/null +++ b/2020/09-Encoding_Error/second.hs @@ -0,0 +1,47 @@ +module Main (main) where +import Control.Monad (when) +import Data.List (foldl') +import Data.Maybe (fromJust, isNothing) +import System.Exit (die) + +exampleExpectedOutput = 62 + +parseInput :: String -> IO [Int] +parseInput filename = do + input <- readFile filename + return $ map read $ lines input + +validate :: [Int] -> Int -> Bool +validate list n = processInput list + where + processInput :: [Int] -> Bool + processInput (_:[]) = False + processInput (x:xs) = (foldl' (\acc i -> acc || (x + i == n && x /= i)) False xs) || processInput xs + +isContiguousSum :: Int -> [Int] -> Int -> Maybe Int +isContiguousSum target list counter + | sum' == target = Just $ (minimum lst) + (maximum lst) + | sum' < target = isContiguousSum target list (counter + 1) + | otherwise = Nothing + where + lst = take counter list + sum' = sum lst + +compute :: Int -> [Int] -> Int +compute len list + | validate (take len list) (list !! len) = compute len $ tail list + | otherwise = list !! len + +compute' :: Int -> [Int] -> Int +compute' target list = case isContiguousSum target list 2 of + Nothing -> compute' target (tail list) + Just a -> a + +main :: IO () +main = do + example <- parseInput "example" + let exampleOutput = compute 5 example + exampleOutput' = compute' exampleOutput example + when (exampleOutput' /= exampleExpectedOutput) (die $ "example failed: got " ++ show exampleOutput' ++ " instead of " ++ show exampleExpectedOutput) + input <- parseInput "input" + print $ compute' (compute 25 input) input |