BGAB7OEZ6LD4XHNHDKL6XRMOF5GXB67RDXGKWN5ZLHVKXCEASX7QC
C Z
C Z
A X
A X
B Z
B Z
B Z
A Z
B X
A X
A X
A X
C Z
C Z
C X
A X
A X
A X
C Z
B Z
C Z
A Y
B Z
A X
C Y
A X
A X
C Y
C Z
A Y
B Z
A X
C Y
B Z
B Z
B Z
A X
C X
C X
B Z
A X
C Z
A X
B Z
A Y
C X
A X
C Z
C Z
B Z
C Y
C X
C X
C X
C X
A Y
C Y
C Z
C Y
A X
C Y
A X
B Z
A Y
C X
A X
B Y
A X
C X
C X
C Z
A X
C X
A X
C X
B Z
A Z
B Y
B Z
B Z
A X
C Y
B X
A X
A X
B Z
A X
C X
C Z
C Z
A X
C Z
C Z
C Z
C X
C Z
A X
B Z
B Y
C Z
B Z
B Z
A X
B Z
C Y
C Z
A X
A Y
C Z
A X
B Y
C Y
C Z
A X
C Y
C X
A X
C X
A X
C Z
A X
C Y
A Y
C Z
C X
C Y
C Y
A Y
A Y
C Y
C Y
A Y
A X
C Z
C Z
C X
C X
C Z
A Y
C Z
C Z
A Y
A Y
B Z
A X
B Z
C Y
B Z
C Z
C Y
C Y
B Y
C X
A X
A X
A X
A Y
A X
C Z
C Z
C Z
A X
B Z
A X
B Z
C Y
C Z
A Y
C Y
A X
A X
C Z
B X
C Z
C Z
B Z
B Z
B Z
C Z
C X
C Z
A X
B Z
C Z
C X
A X
A Y
B Y
A X
B Z
A X
C Z
C Z
C X
B Z
C Z
C Z
C X
A X
A X
B Y
C Y
C Z
B Y
A X
B Z
A X
B X
B Z
C X
C X
C Y
C X
B Y
B Z
C X
A Y
C X
C Y
A X
C Z
C Z
C X
B Z
A Y
B Z
A Y
B X
A X
C Z
B Z
C X
C X
C X
A X
C X
B Z
C Z
B Y
B Z
A X
A X
C Z
B Z
A X
A Z
C Y
B Z
C X
C Z
A Y
C X
A X
A X
A Y
B Z
A X
B Z
A Y
B X
C X
C Y
A X
C Z
B X
C Z
C X
C X
C Z
A X
B Z
C Z
C X
C Z
B Y
A X
C X
C Y
A X
C Z
A X
B Z
C X
C X
B Z
C Z
C Z
C Y
A X
C Z
C X
A X
C Y
C Z
C Z
C Y
B Y
B Z
A X
B Y
C X
A X
A X
C Y
C Z
B Z
C X
C X
B Z
C Z
A X
A Y
A X
C Y
A Y
B Y
A X
A X
C X
C X
B Z
A Y
B Z
C Z
A X
A Y
A X
C X
A X
C Z
B Y
C Z
A X
B Z
C Z
C Z
A X
A X
B Z
B Z
B Z
A X
C X
A X
A X
C Y
C Y
C X
C X
A X
A Y
B Y
C Z
C Z
B Y
C X
C Z
A Y
C X
C Z
C X
B Z
C Y
C Z
C X
C Y
C Z
B Z
C Z
B Z
A X
B Y
B Y
C Z
B Z
C X
C Z
C Z
C Z
B Y
B Z
C Z
B Y
A X
A X
C X
A X
C X
A X
B Z
A X
A X
A X
C Z
A Y
A X
C Z
C X
A X
C X
A X
B Z
C Z
C Z
C Z
A X
A X
C Z
A X
B Z
C X
C Z
C Y
B Z
A X
B Z
A X
A Z
B Y
B Z
B Z
B Z
A Y
C Z
A X
B Y
C X
B X
B Z
C X
B Y
C Z
A X
C X
B Z
A X
B Z
A X
A X
B Y
C Y
C X
C X
C Z
A X
C Z
A X
B Y
C X
C Y
B Y
B Y
A Y
C X
A Y
C Z
C Y
A X
C Z
C Z
B Z
A X
A X
A X
A X
B Z
C Z
C X
C X
C Z
A X
B Z
B Y
C Y
A Y
C X
B Z
A Y
B Z
C Z
B Z
C X
A X
B Z
A X
A Y
C Y
B Z
B Z
C X
C Z
C Z
C Z
A X
B Z
A Y
A X
C Y
A Y
B Z
A Y
C Z
A Y
A Y
C X
A X
B Z
A Y
B Z
C X
A X
B Y
B Z
C Z
C Z
B Z
A X
A X
B Y
C Z
C Y
B Z
C Z
A Y
A X
C X
C Z
A X
A X
A Z
C X
C X
B X
B Z
A Y
C X
A Y
C X
C Z
A Y
B Z
A X
B X
A Y
C X
C Y
A Y
C X
B Y
C Y
A X
B Z
A X
C Z
A X
A X
C Z
C Z
B X
C X
A Y
B Z
C Z
A X
A X
C Z
C Y
A X
C X
C Z
C Y
C X
C Y
C X
C Z
C Z
B Z
A X
A Y
B Z
A X
B Z
C X
B Y
A X
A X
A X
A X
B Z
C Z
B Z
B Y
C Z
C X
C Z
C X
B Z
C Z
A X
C Z
C Z
A Y
C X
A X
B Z
A X
B Z
B Y
A X
A X
A X
A Y
C Z
A X
B Y
A Y
B Y
C Y
A X
A X
C Y
A X
C Z
B Z
C X
C Z
A X
B Z
C Z
B Z
B Z
B Z
C X
C Z
A X
A Y
C X
C Z
B Z
B Y
C Z
B Y
B Z
C Z
A Y
B Z
C X
C Y
A X
B Y
A X
C Z
C X
C Z
A X
C X
B Z
B X
C Z
B Z
A Y
A X
A Y
C Z
C Y
A X
B X
A Z
C Y
C X
C Y
C X
C Y
B Z
C X
B Y
C Z
C Y
B Z
A Y
B Y
C Z
C X
B Z
A Y
C Z
C Z
C Z
C Y
C X
C X
B Y
C Z
A Y
C Z
C X
B Y
C X
B Z
B Z
B Z
B Z
C Y
C Z
C X
B X
C Z
C Z
C Z
C X
B Y
B Z
C X
A X
C Y
B X
C X
C X
C Z
A X
A X
B Z
B Z
A X
C Z
A X
A Y
C X
B X
C Y
C Y
A X
A X
C Z
C Z
B Y
B Y
B Z
C X
A X
A Z
C Z
B Y
C Y
C X
C Y
B Z
C X
A X
A X
C Z
C Y
B X
C Z
B Z
A X
C X
A Y
C Y
C Z
B Z
C Z
A X
C Y
B Z
C Y
B X
C Z
C Z
A X
A X
C X
C Z
C X
C Y
C Z
A Y
C X
C Z
B Y
B Y
C Z
A X
C Y
A X
C X
C X
B Y
C Z
C Z
A X
A Y
C Z
B Z
C Y
A X
A X
C Z
C Z
A X
C Z
C Z
B Z
B Z
A X
A Y
A X
C Z
C X
A X
B X
C Z
C Z
B Y
A X
B Z
C X
C Z
C Z
C Z
C X
A Y
A X
A Y
A X
A Y
C Z
C Z
B Z
B Y
A X
B Z
C Z
C X
C Y
C Z
A X
C Y
B Y
B Z
C Z
B Y
C X
C Z
B Y
B Z
B Y
C X
C Z
C X
C Z
B Y
B Z
C X
A X
A Y
B Z
B Y
A X
A X
C Z
A X
A X
C X
A X
C Z
C X
A X
B X
A Y
C X
A X
C Y
A X
C Z
A X
A X
C Z
A X
A X
C Z
A X
B Y
B Z
A X
C X
A X
C X
B Z
C Y
A Y
C Z
B Z
A X
C X
A X
B Y
C X
B Y
B Z
A X
B Z
C X
B Z
A X
A X
C X
A X
C X
A Y
C Z
A X
B Y
B Z
C Z
C Z
A X
C Y
B Z
C X
B Z
B Z
C Z
A X
C X
C X
A Y
A X
C Z
B Z
A X
B X
A X
B Z
B Z
C Z
B Y
C Z
A X
C Z
C Z
C Z
C X
A X
A X
C Y
B Y
C Z
B Y
A X
B Z
A Y
C Y
B Y
C Z
C X
C X
A X
B Y
A X
A X
C Z
C X
C Y
A X
A X
A X
C X
B Z
B Y
A X
B Y
C X
C Z
B Z
A X
C X
C Z
B Y
A X
C Z
B Z
B Z
A X
B Y
A X
B Y
C Z
C Z
B Z
C Z
C Y
A X
B Z
C Z
A Y
C Z
B Z
B Z
C Z
B Y
C Z
C Z
B Z
A Y
C X
C Y
B Z
C X
C Z
A X
A X
C Y
A Z
C Z
C X
B Z
B Z
C Y
A X
A Y
C Z
A X
A X
B Z
A X
C X
C X
B X
B X
A Z
B Y
A X
A Y
C Z
A X
A X
B Z
B Z
C Y
A X
C Y
C Z
A Y
C Y
B X
C X
A X
B Z
A X
A X
A X
A X
A X
B X
A X
C Z
B Z
B Z
B X
A X
C Z
B Z
C Z
C Z
C Y
A X
C Y
C Y
C Z
A Y
C Z
A X
C X
C Z
A X
A Y
C Z
C X
A X
C X
B Y
C Z
B Z
A X
C Y
B Z
B Y
A X
C Z
A X
B Z
C Z
C Y
C Z
A X
A X
B Z
B Y
A X
C X
C Y
B X
C Z
A Y
C X
B Y
B Z
A Y
C Y
C Z
C Z
C X
A X
A X
C X
C X
C Z
C X
C X
B X
B Z
B Z
C X
C Z
C X
A X
A X
A X
C Z
C Y
B Z
C X
C X
A X
C X
C Y
A X
B Y
A X
C Z
C Z
B Z
A X
A X
A X
B Z
C X
A X
B Y
B Z
C X
B Y
C X
B Y
C Z
B X
A X
A X
B Z
A X
A X
A X
B Z
A X
C Z
C X
C Z
A X
C Y
C Y
C Z
C Z
C Z
A X
C Z
C X
C Z
C Z
A X
B Z
C X
C Y
B X
B Z
B Z
A X
C Y
B Y
C Z
B Z
C Z
C X
A Z
C Z
B X
C X
C Z
C Z
C X
C Z
C Z
A X
B Z
C Z
C X
A X
B Z
C Y
C Y
B Y
C X
A X
A X
C Z
B Z
C X
C X
C X
B Y
C Z
B X
C X
C Z
A X
A X
C Z
C Z
C X
C X
C Z
A X
C Z
C X
C Z
C Z
A X
C Z
A X
A X
A X
B Z
A X
B Z
C Z
C Z
A X
C Z
C Z
B Z
C Z
A Y
C X
A X
A X
C X
A X
C X
C X
A Y
B Y
C Z
B Z
C X
B Y
C Y
C X
C Z
A X
C Y
B Z
B Y
A X
B Y
B Y
A X
C X
C X
A X
A Y
C Y
B Z
A X
B Z
A Y
B Y
C Z
C Z
C Z
A Y
B Y
B Y
C Z
B Z
C Z
A X
C Y
A X
B Y
B Z
C X
C Y
A X
B Z
B Z
A X
B Z
C Y
A X
C X
C Z
C Z
A X
C Y
A X
C X
C X
B Z
B Y
A X
C Y
B Z
B Y
A X
C Z
A X
B Y
A X
A X
A X
C X
A X
C Z
B Z
C Z
A X
A X
B Y
C X
C Y
C Z
A X
C Z
B Z
A X
B Z
A X
B Y
B Z
C Z
C Z
C Y
C X
A X
C Z
A Y
A X
B Z
B Y
A X
C X
C Z
B Z
A X
C Z
C X
C Y
A X
A X
C Z
A X
A X
C X
C X
A X
C X
C Z
A X
A X
C Y
A Y
B Z
C X
C X
B Y
B Z
A X
B Z
C Z
C Z
A Y
C Y
C Z
A X
C Z
A X
C Y
C X
B X
B Z
A X
A X
B Z
A X
C X
C X
A Y
A X
A X
C Y
B Z
A X
B Y
C X
B Z
C Y
B Y
A X
C Z
B Y
B Z
A X
B Y
C X
C Z
A X
B Z
A X
C Y
C Z
A X
A X
C Y
C Y
C X
A Y
C Z
B Z
A X
A Y
C Z
C Z
C Z
C Z
B Y
A Y
A X
A X
C X
A X
B Y
C Z
B Z
A Y
C X
C X
A Y
A X
A X
C X
C Z
C X
A X
A Y
C X
C Z
C X
A X
A X
C Z
C X
A X
C X
C Z
A X
A X
C Z
B Y
A X
C Z
C Y
C Z
C Z
B X
B Z
B X
A X
C Z
B X
C Z
A X
C Z
A Y
A Z
B Z
C X
A X
A X
A X
A X
A X
C Z
A X
B X
A Y
A X
C X
A X
A Y
A Y
B Y
C X
A Y
A X
C Z
C Z
C Y
B Z
C X
C Z
A Y
C X
C Y
C X
A X
B Y
C Z
C Z
A X
C Z
B Z
B Z
C X
C X
A X
B Y
C X
C X
A X
C Z
B Y
C Y
C Z
A X
B Z
C Z
B Y
C X
A X
B Y
B Z
A X
C Y
B Z
C Z
C X
A X
C X
A X
B Y
C X
A X
C Y
B Z
B Z
B Z
C Y
A X
A X
A Y
C Z
B X
B Z
A X
A X
C X
A X
C X
A X
C X
A X
A X
A X
A Y
A Y
B Y
A X
B Y
A X
B Y
B Z
B Y
A Y
C Z
C Z
C Z
C Z
A X
C Z
C X
C Y
C Z
B Z
B Z
B Z
C Y
C Z
B Z
C X
A Y
A X
C X
C Y
A Y
B Y
C X
C X
B Y
C Z
A X
C X
C X
C X
C X
C X
C X
B Z
C Y
A X
A X
B Y
B Z
A X
C X
C Z
A X
B X
B Z
C Y
B Z
C Z
C Y
A X
C Z
B Y
C X
A X
A Y
A X
C X
A Y
A Y
C Z
B Z
C Z
C X
C Y
B Y
A X
C X
C Z
B Y
A X
B X
B Z
C Z
B Z
B Z
A X
A Y
A X
A X
B Z
C Z
A X
A Y
C Z
C Z
C Y
A X
B Z
C X
C X
A Y
A X
C X
C Y
C Z
C Y
C X
A X
B Z
C Y
B Z
C X
A X
A X
C X
C Z
C Y
C Y
A X
A Y
C Z
A Y
B Y
C Y
A Y
C Z
B Y
C X
A X
B Z
C Z
A X
A X
B Z
C X
B Z
C Z
C Z
A Y
A X
C X
A X
B Z
C X
A X
A X
B Y
A Z
B Z
C X
C Z
C X
C Z
C X
A X
C Z
B Y
C Y
C Z
A X
C Z
A X
A Z
A X
A X
C Z
A X
B Z
C X
B Z
A X
C X
A X
C X
C Z
B Z
A Y
C Y
C Z
C Z
C X
C Z
A X
A X
B Y
B Z
C Y
B Z
A Y
A X
A X
B Z
B X
A X
B Y
B Z
C X
A X
A X
C Z
B Y
C X
B Y
A Y
A Z
A X
B Y
C X
C Z
C Z
C Y
C Z
A X
B X
C X
A Y
A X
C Z
C Y
C X
B Z
A X
C X
C Z
A X
C Z
A X
C X
C X
A Y
C Z
A X
C X
C Z
C Y
A X
A Y
A Y
C Z
C X
A X
C Z
A Y
A Y
A X
B Z
C Z
B Y
C Z
B Y
C X
C Z
B Y
A X
A X
B Z
A X
C Z
A X
A X
B Y
A X
B Z
A Y
A X
A Y
C Z
B Z
A X
B X
B Y
B Z
A X
A Z
B Y
B Z
C X
B Z
A X
B Z
C Z
B Y
C X
A X
A Y
B Y
A Y
C X
C X
B Y
A Y
B Z
C Z
B Z
A Y
A X
B Z
B Z
A Y
C Z
C Z
B Z
C X
B Z
B Y
B Z
B Z
A X
A X
C X
C Z
B Z
A X
B Z
C Y
C Z
A Z
A X
A X
C Z
A X
C Z
C Z
C Z
B Z
A X
A Y
B X
A X
A X
A X
C Z
B X
B X
A X
C Z
A X
B X
A X
A X
B Z
A X
C Z
C Y
A X
B Z
A X
C Z
B Z
A X
A X
B Y
B Y
C Y
A X
B Z
C Y
A X
C Z
B Z
A X
C Z
B Z
C X
B X
B Z
C Z
A X
B Z
A X
A X
A X
A X
C Z
B Z
B Y
C Z
A X
C Z
A X
C X
C X
A X
B Y
C X
B Z
A Y
C Y
B Z
C Y
C X
A X
B Z
C X
B Y
A X
A Y
B Y
B Y
A X
C X
C Z
B Z
A Y
A X
B Y
C X
B Z
B X
C Y
B X
C X
B Y
C X
A X
C Z
B Z
B Y
B Y
A X
A X
A Z
B Z
B Z
C X
C Y
A Y
C Z
C X
A X
C Z
C X
B Z
A Y
B Z
C Z
B Z
B Z
C X
B Z
C X
C X
B Z
A X
B Y
B Z
A X
C X
A X
C Y
A X
C X
B X
C Z
C Y
C Z
B Z
C X
A X
A X
A Y
C Z
C Y
A Y
C Z
B Z
C Z
C Y
A X
A X
C X
C Z
C Z
A Z
C Z
A X
B Z
C X
C Z
A X
B Z
C X
A X
A Y
B Y
C X
A X
A X
C X
C Y
B Z
C X
A X
C X
B Z
B Y
A Y
C Z
A X
C Z
C Z
A X
C Y
B Z
A Y
B Y
B Y
A X
A X
C X
C X
B Y
C Z
C Z
C Z
C X
C Y
C Z
B Z
C Z
A Y
C Z
A X
B Z
B Y
B Z
A X
A X
A X
A X
C X
C Z
B Z
C X
B Z
C Z
A X
C X
C Z
B Y
A X
C X
A X
B Z
B Z
A X
A X
B Y
C Y
C Y
C X
A X
B Z
C Y
B Z
A Y
B Y
B Y
A X
B Z
A X
C X
C Z
A X
B Z
A Y
C Y
B Z
C Z
C Y
A X
C Y
A X
C X
B Z
C X
A X
C Z
A X
B Y
B Z
C X
C Y
B X
A X
B Z
A X
B Y
C X
C X
C Y
C Y
C X
B Y
C Z
C X
B Z
B Y
C X
A Y
C Z
C Z
C X
B X
B Y
A X
A X
C Z
C X
C Y
A X
C Y
A Y
C Z
C X
A X
C Z
C X
A X
B X
C X
C X
C X
B Y
B Z
C X
C Z
A Y
B Y
C X
C X
A X
B Z
C Z
A X
C Y
C Z
A Y
B Z
C X
C Z
A X
C Z
B Z
B Y
B Z
A X
C X
A Y
C X
C Z
B Y
C Y
C Z
C Z
A X
A X
A X
C Z
B Y
C Z
A X
A X
B Z
B Y
B Z
C Z
B Z
A Y
C Y
C Z
B Y
A X
A X
C Z
B Y
C Z
A X
C X
B Y
A Y
B Z
A X
A X
A X
B Y
A X
C Z
B Y
C Z
B Y
C Z
C X
C Y
C X
A X
A X
A X
C Z
C X
C X
B Y
A Y
B Z
B X
C Z
B Y
A X
C Y
B Z
C X
A X
A X
A X
A X
C X
B Y
A X
A X
B Y
A X
B Z
C Z
A X
A X
A X
A X
B Z
A X
C Z
C X
C Y
B Z
C Z
A X
C Y
C Z
A X
A X
C X
B Z
C X
B Z
C Z
A X
A X
A Y
B Y
C Z
B Y
A X
C X
C Z
C Z
C X
A X
A X
C Z
A X
A Y
A X
A X
C Z
C X
C X
C Z
C X
A X
C Z
C Z
B Z
A Y
A Y
B Y
A X
A X
C X
C X
A X
A X
C X
C X
B Y
C Z
A X
B Y
A X
A X
A X
C X
C Y
B Z
B Y
B Z
C Z
C Z
C X
C Z
A X
B Z
A Y
C Z
B Z
A X
C Y
B Z
C Z
C Y
A X
B Y
C Z
A X
A X
A X
C Z
C Z
C X
A Y
C X
B Z
B Y
A X
C X
C X
A Y
A Y
A X
B X
B Z
B Y
B Y
A X
C Y
A X
C Z
C X
C X
C Z
B Z
B Z
C Y
C X
B Z
C Z
A Y
C Y
A X
B Z
A X
C Y
B Z
B Y
C Z
A X
A X
C Z
B Z
B Z
C Z
C Y
C Z
C Z
C X
A Y
A Y
B Z
C Z
B Y
C X
C X
A Z
C Z
A X
A X
C X
A Y
C X
A X
A X
A X
C Y
A X
B Y
A X
B Y
A X
A X
A Y
C X
C Z
A X
C X
B Y
B Z
B Z
A Y
C Z
C X
C X
B Z
B Z
C X
B Y
A X
B Y
A X
A X
C Y
B X
C X
A Z
A Z
A X
C Z
C Y
C Z
C Y
A Y
B X
C Z
module Main where
import Data.Bifunctor (bimap, first)
import Aoc
type Player1 = Choice
type Player2 = Choice
main :: IO ()
main = do
content <- input 2
let run = Aoc.run content
run 14264 (strategy one)
run 12382 (strategy two)
where
one = parse (\x -> (snd x, uncurry (flip outcome) x)) parseChoice parseChoice
two = parse (\x -> first (decide (snd x)) x) parseChoice parseOutcome
strategy :: (String -> [(Choice, Outcome)]) -> String -> Int
strategy a = sum . map (uncurry score) . a
data Choice = Rock | Paper | Scissor
deriving (Eq, Ord, Show, Enum)
data Outcome = Loss | Draw | Win
deriving (Show, Enum)
outcome :: Player1 -> Player2 -> Outcome
outcome a b
| a == b = Draw
| beats a == b = Win
| otherwise = Loss
beats :: Choice -> Choice
beats Rock = Scissor
beats a = pred a
loses :: Choice -> Choice
loses Scissor = Rock
loses a = succ a
choiceScore :: Choice -> Int
choiceScore = (+1) . fromEnum
outcomeScore :: Outcome -> Int
outcomeScore = (*3) . fromEnum
score :: Choice -> Outcome -> Int
score a b = choiceScore a + outcomeScore b
parseChoice :: Char -> Choice
parseChoice 'A' = Rock
parseChoice 'X' = Rock
parseChoice 'B' = Paper
parseChoice 'Y' = Paper
parseChoice 'C' = Scissor
parseChoice 'Z' = Scissor
parseChoice _ = error "malformed input"
-- for part2
parseOutcome :: Char -> Outcome
parseOutcome 'X' = Loss
parseOutcome 'Y' = Draw
parseOutcome 'Z' = Win
parseOutcome _ = error "malformed input"
parseTurn :: (Char -> a) -> (Char -> b) -> String -> (a, b)
parseTurn a b (x : _ : y : _) = bimap a b (x, y)
parse :: ((a, b) -> (Choice, Outcome)) -> (Char -> a) -> (Char -> b) -> String -> [(Choice, Outcome)]
parse a b c = map (a . parseTurn b c) . lines
decide :: Outcome -> Choice -> Choice
decide Win a = loses a
decide Draw a = a
decide Loss a = beats a