diff --git a/hs/src/Aoc/Y2020.hs b/hs/src/Aoc/Y2020.hs index d347d1d..046cc53 100644 --- a/hs/src/Aoc/Y2020.hs +++ b/hs/src/Aoc/Y2020.hs @@ -12,6 +12,7 @@ import qualified Aoc.Y2020.D06 as D06 import qualified Aoc.Y2020.D07 as D07 import qualified Aoc.Y2020.D08 as D08 import qualified Aoc.Y2020.D09 as D09 +import qualified Aoc.Y2020.D10 as D10 year :: Year year = Year 2020 @@ -24,4 +25,5 @@ year = Year 2020 , ( 7, D07.day) , ( 8, D08.day) , ( 9, D09.day) + , (10, D10.day) ] diff --git a/hs/src/Aoc/Y2020/D10.hs b/hs/src/Aoc/Y2020/D10.hs new file mode 100644 index 0000000..d5ff1ab --- /dev/null +++ b/hs/src/Aoc/Y2020/D10.hs @@ -0,0 +1,33 @@ +module Aoc.Y2020.D10 + ( day + ) where + +import Data.List + +import Aoc.Day +import Aoc.Parse + +parser :: Parser [Integer] +parser = manyLines decimal + +possibilities :: Integer -> Integer -> Integer -> [Integer] -> Integer +possibilities _ _ c [] = c +possibilities a b c (1:xs) = possibilities b c (a + b + c) [x - 1 | x <- xs] +possibilities _ b c (2:xs) = possibilities c 0 (b + c) [x - 2 | x <- xs] +possibilities _ _ c (3:xs) = possibilities 0 0 c [x - 3 | x <- xs] +possibilities _ _ _ (_:_) = 0 + +solver :: [Integer] -> IO () +solver nums = do + let snums = sort nums ++ [maximum nums + 3] + + putStrLn ">> Part 1" + let diffs = zipWith (-) snums (0 : snums) + print $ length (filter (==1) diffs) * length (filter (==3) diffs) + + putStrLn "" + putStrLn ">> Part 2" + print $ possibilities 0 0 1 snums + +day :: Day +day = dayParse parser solver