Solve day 5 part 2

This commit is contained in:
George Thomas 2025-12-05 15:36:12 +00:00
parent 1429445efe
commit 67180c098f
2 changed files with 23 additions and 3 deletions

View File

@ -1,9 +1,8 @@
module Puzzles.Day5 (puzzle) where module Puzzles.Day5 (puzzle) where
import Control.Monad import Control.Monad
import Data.Functor import Data.List
import Data.List.Extra import Data.Ord
import Data.Maybe
import Data.Text.Lazy qualified as TL import Data.Text.Lazy qualified as TL
import Puzzle import Puzzle
import Text.Megaparsec hiding (some) import Text.Megaparsec hiding (some)
@ -25,6 +24,12 @@ puzzle =
. length . length
. filter (flip any ranges . isInRange) . filter (flip any ranges . isInRange)
$ vals $ vals
, TL.show
. sum
. map rangeLength
. foldr addInterval []
. sortOn (Down . (.lower))
. fst
] ]
, extraTests = mempty , extraTests = mempty
} }
@ -35,5 +40,19 @@ data Range = Range
} }
deriving (Eq, Ord, Show) deriving (Eq, Ord, Show)
rangeLength :: Range -> Int
rangeLength r = r.upper - r.lower + 1
isInRange :: Int -> Range -> Bool isInRange :: Int -> Range -> Bool
isInRange n r = n >= r.lower && n <= r.upper 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

1
outputs/real/5/2 Normal file
View File

@ -0,0 +1 @@
348548952146313