f# - 扑克手 - 在 F# 中确定满堂彩

标签 f# poker

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

如何限制这一点,使其不能将一种类型的 3 减少为一对?


谢谢!

编辑:F# 新手

EDIT_2:满堂彩是指当您手中的 5 张牌中有 3 张(3 个相同的值(花色无关紧要,但它们必须是 3x A 或 3x 10 等))并且一对(2x 10's,2x 8's 等 - 花色无关紧要)

输入:

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

预期输出:假, 实际输出:真

输入:

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

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

最佳答案

我对此的看法是处理所有四种情况,满屋,三人,对或以上所有情况都没有。

为此,我将使用 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)])]

即三个国王的列表,一个十的列表和一个九的列表。

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

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

关于f# - 扑克手 - 在 F# 中确定满堂彩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41059970/

相关文章:

F#: "type X = Y of Z"的含义

c - C语言的扑克牌游戏。请解释花色[4][9]和花色[13][6]?

python - python 扑克中的同花顺和皇家同花顺

http - 从 C# 移植到 F# 时出现 System.Net.WebException

haskell - Haskell、Ocaml、Javascript 中的语句与表达式

java - 比较Java中的扑克手牌

algorithm - 一种高效的高效算法,可以找到 N 张牌的所有可能手牌? (OFC幻想世界)

c++ - 段错误 set_union 与对象:std::set<CardSet>

visual-studio - F# 项目不支持生成依赖图?

c# - 如何将 F# 和 C# 程序集与 ILMerge 合并,以便在引用时所有类型都可用?