Day 7
This commit is contained in:
53
day07/Commons.hs
Normal file
53
day07/Commons.hs
Normal file
@@ -0,0 +1,53 @@
|
||||
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
|
||||
|
||||
|
||||
getHandValueTypeFromSorted :: [Int] -> Int
|
||||
getHandValueTypeFromSorted [a, b, c, d, e] | a == e = 6
|
||||
| a == d || b == e = 5
|
||||
| a == c && d == e || a == b && c == e = 4
|
||||
| a == c || b == d || c == e = 3
|
||||
| a == b && (c == d || d == e) || b == c && d == e = 2
|
||||
| a == b || b == c || c == d || d == e = 1
|
||||
| otherwise = 0
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user