data Hand = Rock | Paper | Scissor deriving (Eq, Enum, Bounded, Show) instance Ord Hand where compare x y = case (fromEnum x - fromEnum y) `mod` 3 of 0 -> EQ 1 -> GT _ -> LT (+.) :: Hand -> Int -> Hand (+.) a b = toEnum $ flip mod 3 $ (+) (fromEnum a) b main :: IO () main = do input <- map (concat . words) . lines <$> readFile "input" print $ day2 id input print $ day2 realStrat input toHands :: [Char] -> [Hand] toHands x = map toEnum $ zipWith subtract [65, 88] (map fromEnum x) realStrat :: [Hand] -> [Hand] realStrat [a, b] = [a, a +. fromEnum (b +. 2)] day2 :: ([Hand] -> [Hand]) -> [[Char]] -> Int day2 f = sum . map (play . f . toHands) play :: [Hand] -> Int play [x, y] = fromEnum y + 1 + if x == y then 3 else fromEnum (x < y) * 6