From 67180c098fd25e6a6236555e989c254d9859d692 Mon Sep 17 00:00:00 2001 From: George Thomas Date: Fri, 5 Dec 2025 15:36:12 +0000 Subject: [PATCH] Solve day 5 part 2 --- haskell/Puzzles/Day5.hs | 25 ++++++++++++++++++++++--- outputs/real/5/2 | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 outputs/real/5/2 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