-3

パート 1. Cards というオブジェクトがあります。Name、Suit、Value 属性 (Jack、Diamonds、2) があります。プレイヤーがフォーカード (同じ名前属性を持つ 4 枚のカード) を持っているかどうかを数えたいと思います。これはどのように達成できますか?効率的なアルゴリズムを探しています。

パート 2. 同じスートの 5 枚のカードを連続して見つけるアルゴリズムが必要です (つまり、7、8、9、10、ハートのジャック)。そこにいるすべての賢い人々に前もって感謝します!

明確にするために、各プレーヤーには合計 8 枚のカードが配られます。プレイヤー(オブジェクト)は、カード[オブジェクト]のリストであるハンドという属性を持っています。

4

1 に答える 1

4

パート 1 では、これを行うことができます。

var has4ofaKind = cards.GroupBy(c => c.Name).Any(g => g.Count() >= 4);

Valueパート 2では、文字列ではなく整数などのプロパティがあれば、はるかに簡単になります。次に、これを行うことができます:

var firstSuit = cards.First.Suit();
var isFlush = cards.Skip(1).All(c => c.Suit == firstSuit);
var isStraight = !cards.OrderBy(c => c.Value)
                       .Select((c, i) => c.Value - i)
                       .Distinct().Skip(1).Any();
var isStraightFlush = isFlush && isStraight;

これはハンドが 5 枚のカードであると仮定していることに注意してください。8 枚のハンドで 5 枚のカードのストレート / フラッシュを見つけるには、次のようなものを使用する必要があります。

var hasFlush = cards.cards.GroupBy(c => c.Suit).Any(g => g.Count() >= 5);
var hasStraight = !cards.OrderBy(c => c.Value)
                        .Select((c, i) => c.Value - i)
                        .GroupBy(x => x)
                        .Any(g => g.Count() >= 5);

ストレート フラッシュを見つけるのは少しトリッキーです。

var hasStraightFlush= !cards.OrderBy(c => c.Value)
                            .Select((c, i) => new { x = c.Value - i, c.Suit })
                            .GroupBy(x => x)
                            .Any(g => g.Count() >= 5);
于 2013-06-03T21:23:40.967 に答える