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
|
2025-12-05 14:39:42 +00:00
|
|
|
. filter (flip any ranges . isInRange)
|
|
|
|
|
$ 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
|