ポーカーの役判定
引数に手札を与えると、ポーカーの役を表示するプログラムを作ってください。 条件: * スートは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)