diff --git a/haskell/Puzzles/Day5.hs b/haskell/Puzzles/Day5.hs index f102c20..6a07f97 100644 --- a/haskell/Puzzles/Day5.hs +++ b/haskell/Puzzles/Day5.hs @@ -1,9 +1,8 @@ module Puzzles.Day5 (puzzle) where import Control.Monad -import Data.Functor -import Data.List.Extra -import Data.Maybe +import Data.List +import Data.Ord import Data.Text.Lazy qualified as TL import Puzzle import Text.Megaparsec hiding (some) @@ -25,6 +24,12 @@ puzzle = . length . filter (flip any ranges . isInRange) $ vals + , TL.show + . sum + . map rangeLength + . foldr addInterval [] + . sortOn (Down . (.lower)) + . fst ] , extraTests = mempty } @@ -35,5 +40,19 @@ data Range = Range } deriving (Eq, Ord, Show) +rangeLength :: Range -> Int +rangeLength r = r.upper - r.lower + 1 + isInRange :: Int -> Range -> Bool isInRange n r = n >= r.lower && n <= r.upper + +extend :: Int -> Range -> Range +extend upper r = r{upper = max r.upper upper} + +addInterval :: Range -> [Range] -> [Range] +addInterval new = \case + [] -> [new] + (r : rs) -> + if isInRange new.lower r + then extend new.upper r : rs + else new : r : rs diff --git a/outputs/real/5/2 b/outputs/real/5/2 new file mode 100644 index 0000000..1525b0e --- /dev/null +++ b/outputs/real/5/2 @@ -0,0 +1 @@ +348548952146313 \ No newline at end of file