Anonymous user
Poker hand analyser: Difference between revisions
m
→Basic Version
m (→Basic Version) |
m (→Basic Version) |
||
Line 1,956:
=={{header|Haskell}}==
===Basic Version===
<lang Haskell>import Data.List (group, nub, any, sort, sortBy)
import Data.
data Suit = Club | Diamond | Spade | Heart deriving (Show, Eq)
data Rank = Ace | Two | Three | Four | Five | Six | Seven |
Eight | Nine | Ten | Jack | Queen | King
deriving (Show, Eq, Enum, Ord, Bounded)
data Card = Card { suit :: Suit
, rank :: Rank
} deriving (Show, Eq)
Line 1,974 ⟶ 1,973:
isSucc :: (Enum a, Eq a, Bounded a) => [a] -> Bool
isSucc [] = True
isSucc
isSucc (x : y : zs) | x /= maxBound && y == succ x = isSucc $ y : zs
isSucc _ = False
parseCard :: String -> Maybe Card
parseCard [] = Nothing
parseCard xs = Card <$> parseSuit <*> parseRank
where
"2" -> Just Two▼
"q" -> Just Queen
"k" -> Just King
where r = init xs▼
_
'♦' -> Just Diamond▼
parseSuit = case s of
'♣' -> Just Club▼
_ -> Nothing▼
'♠' -> Just Spade
where s = last xs
nameHand :: String -> String
nameHand s | invalidHand = ": invalid"
| straight && flush = ": straight-flush"▼
| invalidHand = ": invalid" ▼
|
| ofKind
|
|
▲ | straight = ": straight"
|
| uniqRanks ==
|
where
ranks
where
rankCountTuple xs = sortedGroups $ map
where
groupedByRank = group sortedRank
rankCount c@(x
sortedGroups
uniqRanks = length ranks
straight = isSucc sortedRank || sortedRank == acesHigh▼
ofKind n
flush = all (\c -> s'' == suit c) cards where s'' = suit $ head cards
testHands :: [String]
testHands =
[ "2♥ 2♦ 2♣ k♣ q♦"
, "2♥ 5♥ 7♦ 8♣ 9♠"
Line 2,046 ⟶ 2,049:
main :: IO ()
main = mapM_ (putStrLn
{{out}}
<pre>
|