Comment detail

ポーカーの役判定 (Nested Flatten)

rankとsuitを分離して扱いました.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
def poker(hand)
  def one_pair(rank, count = 0)
    rank.values.map{|x| count += 1 if x.size == 2}
    count == 1
  end
  def two_pair(rank, count = 0)
    rank.values.each{|x| count += 1 if x.size == 2}
    count == 2
  end
  def three_cards(rank)
    rank.values.map{|x| x.size == 3 ? true : nil}.compact.shift
  end
  def straight(rank)
    rank.size == 5 ? rank.keys.sort.first + 4 == rank.keys.sort.last : false
  end
  def flush(suit); suit.size == 1 ;end
  def fourcards(rank)
    rank.values.map{|x| x.size == 4 ? true : nil}.compact.shift
  end
  def convert(char)
    case char
    when 'T': 10
    when 'J': 11
    when 'Q': 12
    when 'K': 13
    when 'A': 14
    else
      char.to_i
    end
  end
  def div_suit_and_rank(hand)
    suit_hash, rank_hash = Hash.new, Hash.new
    cards = hand.split('')
    Array.new(hand.size.div(2)){|i| 2*i}.each{|i|
      suit = cards[i]
      rank = convert(cards[i+1])
      eval("suit_hash[suit] #{(suit_hash[suit] ? '<< rank' : '= [rank]')}")
      eval("rank_hash[rank] #{(rank_hash[rank] ? '<< suit' : '= [suit]')}")
    }
    [suit_hash, rank_hash]
  end
  suit, rank = *div_suit_and_rank(hand)
  if straight(rank)
    "#{rank.keys.sort.first == 10 ? 'Loyal ' : ''}Straight #{(flush(suit) ? 'Flush' : '')}"
  elsif fourcards(rank)
    "Four of a Kind"
  elsif three_cards(rank) and one_pair(rank)
    "Full House"
  elsif flush(suit)
    "Flush"
  elsif three_cards(rank)
    "Three of a Kind"
  elsif two_pair(rank)
    "Two Pair"
  elsif one_pair(rank)
    "One Pair"
  else
    "No Pair"
  end
end
hands = ['SQSJSASKST', 'D9D7D6D5D8', 'C2D2S2H3H2', 'C2D3S2H3H2', 'S9S4S8STSJ', 'C4H7D5S6H3', 'S6H6C5DQC6', 'S6HQC5DQC6', 'S6H4C5DQC6', 'SJSQSKSAC2']
hands.each{|x| puts poker(x)}

残念ながらこれだと、xAx2x3x4x5の形のランクの並びがストレートと判断されないようです。

Aは最初または最後とされているみたいですね。

確かに, Aを14としたのが敗因でした. straightメソッドに場合分けを追加する必要がありますね.

Index

Feed

Other

Link

Pathtraq

loading...