diff --git a/2023/day07/day07.hs b/2023/day07/day07.hs index 8feed42..8042268 100644 --- a/2023/day07/day07.hs +++ b/2023/day07/day07.hs @@ -17,36 +17,40 @@ instance Ord Hand where handType :: Hand -> Int handType (C x1 x2 x3 x4 x5) = case cList of - [5] -> 6 - [1, 4] -> 5 - [2, 3] -> 4 - [1, 1, 3] -> 3 - [1, 2, 2] -> 2 - [1, 1, 1, 2] -> 1 - _ -> 0 + [5] -> 7 + [1, 4] -> 6 + signum j + [2, 3] -> 4 + 3 * signum j + [1, 1, 3] -> 3 + 3 * signum j + [1, 2, 2] -> 2 + 2 * j + [1, 1, 1, 2] -> 1 + 2 * signum j + _ -> 0 + signum j where - cList = sort $ map length $ group $ sort [x1, x2, x3, x4, x5] + cList = sort $ map length $ group sList + sList = sort [x1, x2, x3, x4, x5] + j = length (filter (==1) sList) main :: IO () main = do - input <- parse <$> readFile "input" - print $ day07a input + input <- readFile "input" + print $ day07 (parse False input) + print $ day07 (parse True input) -day07a :: [(Hand, Int)] -> Int -day07a = sum . zipWith (*) [1..] . map snd . sort +day07 :: [(Hand, Int)] -> Int +day07 = sum . zipWith (*) [1..] . map snd . sort -parse :: String -> [(Hand, Int)] -parse = map (f . words) . lines +parse :: Bool -> String -> [(Hand, Int)] +parse p2 = map (f . words) . lines where f [x,y] = (parseHand x, read y) f x = error ("parse: Malformed input: " ++ show x) - parseHand = g . map digitToCard + parseHand = g . map (digitToCard p2) g [x1, x2, x3, x4, x5] = C x1 x2 x3 x4 x5 g x = error ("parseHand: Malformed input: " ++ show x) -digitToCard :: Char -> Int -digitToCard x +digitToCard :: Bool -> Char -> Int +digitToCard p2 x | isDigit x = digitToInt x + | x == 'J' && p2 = 1 | x == 'T' = 10 | x == 'J' = 11 | x == 'Q' = 12