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
|