gpt4 book ai didi

rust - 检查 Rust 中值的连续性

转载 作者:行者123 更新时间:2023-11-29 08:03:59 25 4
gpt4 key购买 nike

我目前正在实现一个扑克游戏,我遇到了一个听起来很简单的问题;可能是这样,但我想不出一个惯用的解决方案:如何检查一手牌是否是顺子?

顺子是指手牌中的所有牌(即 5 张牌)都是连续的,例如二、三、四、五、六。可以忽略花色(否则这将是同花顺过牌)。

考虑以下代码:

#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord)]
enum Rank {
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King,
Ace
}

#[derive(Clone, Copy, PartialEq)]
enum Suit {
Spades,
Clubs,
Diamonds,
Hearts
}

#[derive(PartialEq)]
struct Card {
rank: Rank,
suit: Suit
}

struct Hand(Vec<Card>);

impl Hand {
fn is_straight(&self) -> bool {
// this should be easy
}
}

重点不是遍历 enum - 我知道这目前无法在 Rust 中完成。如果Rank,我不确定如何实现这个s 是一个数组或一个 Vec<Rank> (可以已经排序)。问题是检查是否 HandRank s 是连续的(如 Haskell 中的 succpred)。

有什么想法可以在 vanilla Rust 中惯用地做到这一点吗?我想出的最好办法是检查所有 Rank 的排序数组是否s 包含 Hand 的排序数组的 Ranks .

最佳答案

正如 Chris Emerson 已经说过的,您可以将整数值分配给枚举变体,然后通过 as 运算符对其进行转换。所以我们有:

#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord)]
enum Rank {
Two = 2,
Three,
Four,
// ...
}

is_straight() 方法可以使用迭代器魔法实现:

fn is_straight(&self) -> bool {
self.0
.iter()
.map(|c| c.rank as i8 - self.0[0].rank as i8)
.eq(0..5)
}

未经检查的索引 self.0[0] 是安全的,因为 map() 中的闭包仅在向量中至少有一个元素时才会调用。还有它seems to work (我移除了 Suit 以减少噪音)。

关于rust - 检查 Rust 中值的连续性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39181173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com