From: Dominik Bathon Date: 2005-11-21T10:58:17+09:00 Subject: Re: [QUIZ SOLUTION] Euchre Hands (#55) Here is my solution. It also sorts the the cards by a score computed depending on the trump suit, lower is better. Dominik The code: class EuchreCard SUIT_COLOR = { :diamonds => :red, :hearts => :red, :clubs => :black, :spades => :black } SUIT_ORDER = [:diamonds, :clubs, :hearts, :spades] RANK_ORDER = [:nine, :ten, :jack, :queen, :king, :ace] attr_reader :rank, :suit def initialize(str) str = str.to_s.downcase @rank = if str[0] == ?9 :nine else RANK_ORDER.find { |rank| rank.to_s[0] == str[0] } end @suit = SUIT_ORDER.find { |suit| suit.to_s[0] == str[1] } raise "unknown card rank" unless rank raise "unknown card suit" unless suit end def to_s unless rank == :nine rank.to_s[0, 1].upcase else "9" end + suit.to_s[0, 1] end def sort_score(trump) if rank == :jack && suit == trump 0 elsif rank == :jack && SUIT_COLOR[suit] == SUIT_COLOR[trump] 1 else ti = SUIT_ORDER.index(trump) raise "unknown trump suit: #{trump}" unless ti suit_score = (SUIT_ORDER.index(suit) - ti) % 4 10 + suit_score * 10 - RANK_ORDER.index(rank) end end end if $0 == __FILE__ trump = gets.strip.downcase.to_sym unless EuchreCard::SUIT_COLOR.has_key? trump warn "unknown trump suit: #{trump}" exit 1 end cards = readlines.map { |line| EuchreCard.new(line.strip) } cards = cards.sort_by { |card| card.sort_score(trump) } puts trump.to_s.capitalize, cards end