繁体   English   中英

扑克牌 - 确定F#中的满堂红

[英]Poker hand - Determining a full house in F#

当有一个三种类型的时候,我的fullHouse函数的这个问题是真的。 该函数检查3种类型和一对但它满足逻辑只有三种(D,Ace)(C,Ace)(S,Ace)(D,Ten)(D,9)。 这不是一个完整的房子,但它允许相同的3个ace同时满足一对和三个。

我如何限制这一点,以便它不能将3种减少为一对?


谢谢!

编辑:F#新手

EDIT_2:一个满堂红,当你拿出5张牌时,你有3张牌(3个相同值(套装无关紧要,但必须是3倍A或3倍数等))和一对( 2x ten's,2x 8's等 - 套装没关系)

输入:

fullHouse [(D, K);(C, K);(S, K);(D, T);(D, V 9)];;

预期输出:False,实际输出:True

输入:

fullHouse [(D, K);(C, K);(S, K);(D, T);(C, T)];;

预期输出:True,实际输出:True

我对此的看法是处理所有四种类型,满屋,三对,一对或以上所有情况。

为此,我将使用List.groupBy以按卡值分组。 这将为您提供相同卡值的每个组的列表列表。 例如:

[(D, K);(C, K);(S, K);(D, T);(D, V 9)] |> List.groupBy (snd);;

给出结果:

 [(K, [(D, K); (C, K); (S, K)]); (T, [(D, T)]); (V 9, [(D, V 9)])] 

即三个国王的列表,一个Ten的列表和一个Nine的列表。

现在您只需要确保最长的子列表出现在开头以方便模式匹配,因此只需按每个子列表中包含的卡数量对此列表进行排序,然后您可以对手进行模式匹配以获得结果。

let (|FourOfKind|FullHouse|Triple|Pair|Other|) hand =
    let groups = hand |> List.groupBy (snd) |> List.sortByDescending (List.length << snd)
    match groups with
    |(v, [c1; c2; c3; c4]) :: rest -> FourOfKind (c1, c2, c3, c4)
    |(v, [c1; c2; c3]) :: (v2, [c4; c5]) :: rest -> FullHouse(c1, c2, c3, c4, c5)
    |(v, [c1; c2; c3]) :: rest -> Triple(c1, c2, c3)
    |(v, [c1; c2]) :: rest -> Pair(c1, c2)
    |_ -> Other

然后你可以这样做,例如

let printHand = function
    |FourOfKind _ -> printfn "Four of a Kind"
    |FullHouse _ -> printfn "Full House"
    |Triple _ -> printfn "Triple"
    |Pair _ -> printfn "Pair"
    |Other -> printfn "Other"

然后在fsi中:

 printHand [(D, K);(C, K);(S, K);(D, T);(D, V 9)];; Triple printHand [(D, K);(C, K);(S, K);(D, T);(C, T)];; Full House 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM