43 lines
1.1 KiB
Haskell
Raw Normal View History

2025-12-05 12:56:40 +00:00
module Puzzles.Day5 (puzzle) where
2025-12-05 13:16:33 +00:00
import Control.Monad
import Data.Functor
import Data.List.Extra
import Data.Maybe
import Data.Text.Lazy qualified as TL
2025-12-05 12:56:40 +00:00
import Puzzle
2025-12-05 13:16:33 +00:00
import Text.Megaparsec hiding (some)
import Text.Megaparsec.Char
import Text.Megaparsec.Char.Lexer qualified as Lex
2025-12-05 12:56:40 +00:00
puzzle :: Puzzle
puzzle =
Puzzle
{ number = 5
2025-12-05 13:16:33 +00:00
, parser = do
ranges <- flip sepEndBy newline $ Range <$> Lex.decimal <* single '-' <*> Lex.decimal
void newline
vals <- sepEndBy Lex.decimal newline
pure (ranges, vals)
2025-12-05 12:56:40 +00:00
, parts =
2025-12-05 13:16:33 +00:00
[ \(ranges, vals) ->
TL.show
. length
. map fst
. filter (notNull . snd)
$ map
(\v -> (v, mapMaybe (\r -> guard (isInRange v r) $> r) ranges))
vals
2025-12-05 12:56:40 +00:00
]
, extraTests = mempty
}
2025-12-05 13:16:33 +00:00
data Range = Range
{ lower :: Int
, upper :: Int
}
deriving (Eq, Ord, Show)
isInRange :: Int -> Range -> Bool
isInRange n r = n >= r.lower && n <= r.upper