From 62be96ed5732b92c3ba382cda8eb0a99843f22dd Mon Sep 17 00:00:00 2001 From: George Thomas Date: Fri, 5 Dec 2025 13:16:33 +0000 Subject: [PATCH] Solve day 5 part 1 --- haskell/Puzzles/Day5.hs | 33 ++++++++++++++++++++++++++++++--- outputs/real/5/1 | 1 + 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 outputs/real/5/1 diff --git a/haskell/Puzzles/Day5.hs b/haskell/Puzzles/Day5.hs index bfa8e0e..75d0f28 100644 --- a/haskell/Puzzles/Day5.hs +++ b/haskell/Puzzles/Day5.hs @@ -1,15 +1,42 @@ module Puzzles.Day5 (puzzle) where +import Control.Monad +import Data.Functor +import Data.List.Extra +import Data.Maybe +import Data.Text.Lazy qualified as TL import Puzzle +import Text.Megaparsec hiding (some) +import Text.Megaparsec.Char +import Text.Megaparsec.Char.Lexer qualified as Lex puzzle :: Puzzle puzzle = Puzzle { number = 5 - , parser = pure () + , parser = do + ranges <- flip sepEndBy newline $ Range <$> Lex.decimal <* single '-' <*> Lex.decimal + void newline + vals <- sepEndBy Lex.decimal newline + pure (ranges, vals) , parts = - [ \() -> - "TODO" + [ \(ranges, vals) -> + TL.show + . length + . map fst + . filter (notNull . snd) + $ map + (\v -> (v, mapMaybe (\r -> guard (isInRange v r) $> r) ranges)) + vals ] , extraTests = mempty } + +data Range = Range + { lower :: Int + , upper :: Int + } + deriving (Eq, Ord, Show) + +isInRange :: Int -> Range -> Bool +isInRange n r = n >= r.lower && n <= r.upper diff --git a/outputs/real/5/1 b/outputs/real/5/1 new file mode 100644 index 0000000..aabe32b --- /dev/null +++ b/outputs/real/5/1 @@ -0,0 +1 @@ +874 \ No newline at end of file