123456789101112131415161718192021222324252627282930313233343536373839404142 |
- module Day2.Part2 (
- day2_2,
- readGameHints,
- GameHint (GameHint),
- Outcome (Win, Draw, Lose),
- executePlan
- ) where
-
- import Day2.Shared
-
- data Outcome = Win | Draw | Lose deriving (Show, Eq)
-
- newtype GameHint = GameHint (Shape, Outcome) deriving (Show, Eq)
-
- readGameHints :: String -> [GameHint]
- readGameHints = map parseGameHint . lines
-
- parseGameHint :: String -> GameHint
- parseGameHint [x, ' ', y] = GameHint (opponent x, me y)
- where
- opponent 'A' = Rock
- opponent 'B' = Paper
- opponent 'C' = Scissors
- opponent _ = error $ "unknown shape: " ++ [x]
- me 'X' = Lose
- me 'Y' = Draw
- me 'Z' = Win
- me _ = error $ "unknown game result: " ++ [x]
- parseGameHint xs = error $ "readGameHint not implemented for " ++ xs
-
- playGames :: [GameHint] -> Score
- playGames = foldMap (play . executePlan)
-
- executePlan :: GameHint -> Game
- executePlan (GameHint (x, Draw)) = Game (x, x)
- executePlan (GameHint (x, Win)) = Game (x, winAgainst x)
- executePlan (GameHint (x, Lose)) = Game (x, loseAgainst x)
-
-
- day2_2 :: String -> Score
- day2_2 = playGames . readGameHints
|