56 lines
1.2 KiB
Haskell
56 lines
1.2 KiB
Haskell
module AoC.Y2023.D04 where
|
|
|
|
import AoC.Parser
|
|
import AoC.Riddle
|
|
import Text.Megaparsec (sepBy, (<?>))
|
|
import Text.Megaparsec.Char (char, space, string)
|
|
import Text.Megaparsec.Char.Lexer qualified as L
|
|
|
|
type Cards = [Int]
|
|
|
|
data Game = Game
|
|
{ winningCards :: Cards
|
|
, playedCards :: Cards
|
|
}
|
|
deriving stock (Show)
|
|
|
|
-- | parse list of cards
|
|
--
|
|
-- >>> parseText pCards "5 6 42 23"
|
|
-- Right [5,6,42,23]
|
|
pCards :: Parser Cards
|
|
pCards = L.decimal `sepBy` ws
|
|
|
|
-- | parse a game
|
|
--
|
|
-- >>> parseText pGame "Game 1: 5 6 42 23 | 78 56 42"
|
|
pGame :: Parser Game
|
|
pGame = do
|
|
_ <- string "Card "
|
|
_ <- L.decimal :: Parser Int
|
|
_ <- string ": "
|
|
w <- many $ L.decimal <* ws
|
|
_ <- string "|"
|
|
h <- L.decimal `sepBy` ws
|
|
pure $ Game w h
|
|
|
|
-- sets <- pCards `sepBy` (char '|' >> ws)
|
|
-- case sets of
|
|
-- [w, h] -> pure $ Game w h
|
|
-- _ -> fail "expected two sets of cards"
|
|
|
|
pPuzzle :: Parser [Game]
|
|
pPuzzle = linewise pGame
|
|
|
|
solve :: (MonadIO m) => Text -> m (Either Text Solution)
|
|
solve riddle = case parseText pPuzzle riddle of
|
|
Right puzzle ->
|
|
let
|
|
part1 :: Integer
|
|
part1 = 42
|
|
|
|
part2 :: Integer
|
|
part2 = part1
|
|
in
|
|
pure $ Right [part1, part2]
|
|
Left e -> pure $ Left e
|