This commit is contained in:
2023-12-07 15:16:58 +01:00
parent 05de161249
commit 8398aaf876
5 changed files with 128 additions and 0 deletions

44
day07/Commons.hs Normal file
View File

@@ -0,0 +1,44 @@
module Commons where
import Data.List.Utils (split)
import GHC.IO.Handle (isEOF)
import Data.Char (digitToInt, isDigit)
import Data.List (sortOn)
data Hand = Hand { values :: [Int], bid :: Int } deriving Show
data HandValue = HandValue { hand :: Hand, value :: Int } deriving Show
parseValues :: String -> [Int]
parseValues (v: t) | isDigit v = digitToInt v: parseValues t
| v == 'T' = 10: parseValues t
| v == 'J' = 11: parseValues t
| v == 'Q' = 12: parseValues t
| v == 'K' = 13: parseValues t
| v == 'A' = 14: parseValues t
parseValues [] = []
parseHand :: String -> Hand
parseHand handRaw = let valuesRaw: bidRaw: _ = split " " handRaw
in Hand {values = parseValues valuesRaw, bid = read bidRaw}
parse :: IO [Hand]
parse = do done <- isEOF
if done
then return []
else do line <- getLine
let hand = parseHand line
otherHands <- parse
return $ hand: otherHands
getHandSecondValue :: [Int] -> Int
getHandSecondValue [a, b, c, d, e] = 100 * (100 * (100 * (100 * a + b) + c) + d) + e
sortHandValues :: [HandValue] -> [HandValue]
sortHandValues = sortOn value
getWinningsFromSorted :: Int -> [Hand] -> Int
getWinningsFromSorted _ [] = 0
getWinningsFromSorted i (hh: t) = i * bid hh + getWinningsFromSorted (i + 1) t