ポーカーの役判定

エロと風俗情報満載 どう抜く?

引数に手札を与えると、ポーカーの役を表示するプログラムを作ってください。

条件:

    * スートはS,D,H,C、ランクはA,2〜9,T,J,Q,Kのそれぞれ一文字で表します。
    * 手札は S2D5H3CQS9 のように10文字で指定されます。特にソートはされていません。
    * 手札にジョーカーは含まれません。
    * ストレートで取りうるランクの種類はA2345, 23456 ... 9TJQK, TJQKAの10種類で、JQKA2のようにK-A-2をまたぐものはストレートではありません。

実行例:

% ./poker SQSJSASKST
Royal flush


やってみた。
ソースは書いた勢いそのままに。

def judge_hand(cards)
  flush         = true
  royal         = true
  royal_numbers = "ATJQK"
  straight      = true
  same          = 1
  pair          = 0
  
  # flush
  (1..4).each do |i|
    flush = false if cards[0][0] != cards[i][0]
  end

  # royal
  5.times do |i|
    # royal_numbers 中に含まれる cards[i] 文字列を削除
    royal_numbers.delete!(cards[i])
  end
  royal = false unless royal_hand.size == 0
  
  # straight
  numbers = cards.map do |c|
    c[1] = case c[1]
           when 'A'; 1
           when 'T'; 10
           when 'J'; 11
           when 'Q'; 12
           when 'K'; 13
           else    ; c[1]
           end
  end
  min = numbers.min
  max = numbers.max
  (1..3).each do |i|
    straight = false unless numbers.index(min + i)
  end
  straight = true if royal
  
  # same
  hash = Hash.new(0)
  numbers.map{|n| hash[n] += 1}
  same = hash.values.max

  # pair
  hash.each_value do |v|
    pair += 1 if v == 2
  end
  
#   puts "flush: #{flush}"
#   puts "royal: #{royal}"
#   puts "straight: #{straight}"
  
  if (flush && royal)
    puts "Royal flush"
  elsif (flush && straight)
    puts "Straight flush"
  elsif (same == 4)
    puts "Four of a kind"
  elsif (same == 3 && pair == 1)
    puts "Full house"
  elsif (flush)
    puts "Flush"
  elsif (straight)
    puts "Straight"
  elsif (same == 3)
    puts "Three of a kind"
  elsif (pair == 2)
    puts "Two pair"
  elsif (pair == 1)
    puts "One pair"
  else
    puts "No pair"
  end
end

#----
input = ""
if ARGV[0]
  input = ARGV[0]
else
  input = "SQSJSASKST" # Royal flush
  input = "D9D7D6D5D8" # Straight flush
  input = "C2D2S2H3H2" # Four of a kind
  input = "C2D3S2H3H2" # Full House
  input = "S9S4S8STSJ" # Flush
  input = "C4H7D5S6H3" # Straight
  input = "S6H6C5DQC6" # Three of a kind
  input = "S6HQC5DQC6" # Two pair
  input = "S6H4C5DQC6" # One pair
  input = "SJSQSKSAC2" # No pair
end
unless input
  puts "スート: S,D,H,C"
  puts "ランク: A,2〜9,T,J,Q,K"
  puts "ex. SQSJSASKST"
end

cards = []
5.times do |i|
  # String#[nth, len] : nth 番目から長さ len 分の文字列を新しく作って返す
  cards << input[i*2, 2]
end
#p cards
judge_hand(cards)