2025-12-05 13:16:33 +00:00

43 lines
1.1 KiB
Haskell

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 = do
ranges <- flip sepEndBy newline $ Range <$> Lex.decimal <* single '-' <*> Lex.decimal
void newline
vals <- sepEndBy Lex.decimal newline
pure (ranges, vals)
, parts =
[ \(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