0

私の質問は、「配列に存在する可能性のある一連の番号のグループを返すにはどうすればよいですか? 」とよく似ています。

与えられた数字の配列 (基本的にはカードの値) がポーカー ストレートかどうか、または単に最長のシーケンスを返すかどうかを確認する方法を見つける必要があります。

トーマス氏が示唆したように、each_consうまく機能しますが、テキサス ホールデムでは、ストレートは 2、3、4、5、6 または 8、9、10、J、Q だけでなく、K、A、2、3、4 も含まれます。

数値として署名された数値があれば、すべてが簡単になると思います。J は 11、Q は 12 などです。

これを達成する方法はありますか?

4

5 に答える 5

1

入力は数値の配列です。したがって、J = 11、Q = 12、K = 13、A = 1 と仮定しています。

1) 配列を並べ替える 2) 配列を反復処理し、次の数字が前の数字よりも 2 つ以上大きい場合、それはストレート ハンドではないため、false を返します。

J=11、Q=12、K=13、A=1 と想定していない場合は、追加のデータ構造が必要です (ルックアップは O(1) 時間であるため、複雑さを低くするための辞書が必要になる可能性があります)。Dictionary a = new Dictionary(); a.key = "K"; a.value = "13".

[10,11,J,Q,K] の配列がある場合 => それを反復処理して辞書を調べ、値が前のカードよりも 1 つ大きくなると、false を返します。

明らかに、入力配列の長さが 5 を超えるか、空であるか、または < 5 の場合、ベース ケースがあります。オーバーラップ ストレートを実行している場合、K の後に来ることができる唯一のものは、値 1 の A です。 、その場合は、ループを続行します。うまくいけば、これが役に立ちます。

幸運を。

于 2013-02-19T23:47:45.943 に答える
1

最適ではないかもしれませんが、私は以下を使用しますArray#rotate!:

@values = %w{A 2 3 4 5 6 7 8 9 10 J Q K A}

def longest_sequence cards
  cards, values = cards.sort_by{|c| @values.index c}, @values.dup
  # iterate down from 5 and rotate through cards/values until you find a match
  5.downto(1).each do |n|
    values.length.times do
      cards.length.times do
        return cards[0...n] if cards[0...n] == values[0...n]
        cards.rotate!
      end
      values.rotate!
    end
  end
end

longest_sequence ['A', '3', '4']
#=> ["3", "4"]
longest_sequence ['A', '3', '4', '2', '5']
#=> ["A", "2", "3", "4", "5"]
longest_sequence ['A', '10', 'Q', 'J', 'K']
#=> ["10", "J", "Q", "K", "A"]
于 2013-02-20T06:47:35.353 に答える
1

これを試してください(カードを数字に置き換えたと仮定すると、A = 1、2 = 2)

def straight?(my_cards)    
  sorted = my_cards.uniq.sort

  if sorted.length < 5
    # cant form a straight with duplicates
    false

  else
    # also give an Ace a value of 14 so it can be placed after a King
    sorted << 14 if sorted[0] == 1

    # returns true if the last number is equal to 4 plus the first so
    # a hand with 2,3,4,5,6 will return true
    sorted.first + 4 == sorted.last
  end
于 2013-02-20T00:34:18.937 に答える
1

すべての可能なストレートを列挙するだけです:

All_Poker_Straights = %w(A 2 3 4 5 6 7 8 9 10 J Q K A).each_cons(5)

(ソートされた)手がそれらの1つであるかどうかを確認します。

p All_Poker_Straights.include?(%w(4 5 6 7 8))
# => true
于 2013-02-20T10:23:35.913 に答える
0
class Array
  def sequences
    a = sort.uniq.inject([]){|a, e|
      a.last && e == a.last.last + 1 ? a.last.push(e) : a.push([e])
      a
    }
    a.push([*a.pop, *a.shift]) if a.first.first == 1 && a.last.last == 13
    a
  end
end

[1, 3, 4].sequences # => [[1], [3, 4]]
[1, 3, 4, 2, 5].sequences # => [[1, 2, 3, 4, 5]]
[1, 10, 12, 11, 13].sequences # => [[10, 11, 12, 13, 1]]

[1, 3, 4].sequences.max{|a| a.length} # => [3, 4]
[1, 3, 4, 2, 5].sequences.max{|a| a.length} # => [1, 2, 3, 4, 5]
[1, 10, 12, 11, 13].sequences.max{|a| a.length} # => [10, 11, 12, 13, 1]
于 2013-02-20T08:21:30.253 に答える