【问题标题】:Active pattern - Check list for consecutive elements活动模式 - 连续元素的检查列表
【发布时间】:2018-05-12 04:53:38
【问题描述】:

因此,作为一项学校作业,我必须编写一个识别扑克手的部分主动模式,例如:

let (|FullHouse|_|) (x: (string * string) list) =
    x
    |> List.groupBy snd
    |> List.sortByDescending fst
    |> List.forall (fun (_, v) -> v |> List.length > 1)
    |> function true -> Some () | _ -> None

let x6 =
    match [("S", "2"); ("S", "2"); ("S", "Q"); ("S", "Q"); ("S", "Q")] with
    | FullHouse -> sprintf "Full house"
    | _ -> "Nothing"

我已经成功完成了 9 手牌中的 6 手,但我不知道如何检查手牌中是否有顺子(5 个值是连续的,例如 3、4、5、6、 7)。有没有清单。哪位操作员可以帮我做这件事?

【问题讨论】:

  • 这个问题与活动模式无关。这可能是一个简单的功能,你会遇到同样的问题。能够将问题拆分成更小的部分非常有用,这样您就可以提出更具体和相关的问题。
  • 尝试编写一个函数,它只接收卡片值的列表,并检查它们是否连续且唯一。一旦你测试了它自己的工作,你应该能够在你当前的实现中使用它。提示:当你做List.groupBy snd 时,你是按卡值分组,而不是花色。这似乎不对。
  • 我明白这一点,但即使在单独的函数中我也无法做到这一点,因为正如你所说,它仍然是同样的问题。
  • 您可能想要对列表进行排序,然后使用List.pairwise 将卡片分成对。 (pairwise 函数将[1; 2; 3; 4] 变成[(1,2); (2,3); (3,4)])。然后寻找一个属性 P,当且当这手牌是顺子时,它对每对这样的牌都为真。一旦你弄清楚了这个属性 P 可能是什么,你就可以编写一个函数来检查它,并在该对列表上使用 List.forall
  • List.pairwise 可用于检查每个项目是否连续。您可能还需要一个自定义排序功能 - 将图片卡放在正确的位置。

标签: f# functional-programming f#-interactive


【解决方案1】:

在 cmets 的帮助下,我设法解决了这个问题,我将在此处发布解决方案,供遇到相同(或类似)问题的其他人使用。

let GiveValue (x: string) =
    match x with
    | "2" -> 2
    | "3" -> 3
    | "4" -> 4
    | "5" -> 5
    | "6" -> 6
    | "7" -> 7
    | "8" -> 8
    | "9" -> 9
    | "10" -> 10
    | "J" -> 11
    | "Q" -> 12
    | "K" -> 13
    | "A" -> 14
    | _ -> 0

let (|Straight|_|) (x: (string * string) list) =
    x
    |> List.map (fun (_, v) -> v)
    |> List.map GiveValue
    |> List.sort
    |> List.pairwise
    |> List.forall (fun (x, y) -> y-x = 1)
    |> function true -> Some () | _ -> None

let x4 =
    match [("S", "J"); ("D", "9"); ("S", "8"); ("S", "10"); ("S", "Q")] with
    | Straight -> sprintf "Straight"
    | _ -> "Nothing"

【讨论】:

  • 看起来不错。一条评论:List.map (fun x -> GiveValue x) 可以简称为 List.map GiveValue
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多