I seriously debated with myself whether it was worth submitting my solution. It takes a whole 100 lines of code! I decided in the end that I would post it anyway. I made the opposite decision to Robin Stocker and decided to stick with the <=> approach. The cards do have to know about the trump suit, but the deck class automatically handles that. Here it is: class Card @@values = {'A' => :ace, 'K' => :king, 'Q' => :queen, 'J' => :jack, 'T' => :ten, '9' => :nine} @@value_values = {:ace => 6, :king => 5, :queen => 4, :jack => 3, :ten => 2, :nine => 1} @@suits = {'h' => :hearts, 'd' => :diamonds, 'c' => :clubs, 's' => :spades} @@suit_values = {:hearts => 2, :diamonds => -2, :clubs => 1, :spades => -1} # The suit_values is used to compactly calculate the order suits should be sorted in def initialize(string = "Jh", trump = :hearts) @suit = :hearts @value = :ace @trump = trump if string self.parse(string) end end def parse(string) cardarray = string.upcase.scan(/[AKQJT9][HDCS]/) if cardarray.length > 0 @value = @@values[cardarray[0][0,1]] @suit = @@suits[(cardarray[0][1,1]).downcase] end end def rank_value case @suit when @trump return @value == :jack ? 40 : (@@value_values[@value] + 30) when @@suit_values.index(@@suit_values[@trump] * -1) # True when card is of the trump's suit's colour companion return @value == :jack ? 39 : (@@value_values[@value] + 10) when @@suit_values.index((@@suit_values[@trump] % 2) + 1) # Triggers for clubs if trump is red or hearts if trump is black return @@value_values[@value] + 20 else # The last remaining suit comes last return @@value_values[@value] end end def <=>(other) self.rank_value <=> other.rank_value end def printable @@values.index(@value) + @@suits.index(@suit) end include Comparable attr_accessor :trump, :value, :suit end class Hand def initialize(trump = :hearts, *cards) @cards = Array.new @trump = trump cards.each do |cs| @cards << Card.new(cs, trump) end @cards.sort! end def add_card(card) @cards << Card.new(card, @trump) end def display @cards.sort! @cards.reverse.each do |card| puts card.printable end end def inspect handstring = String.new @cards.each do |card| handstring << card.printable << ', ' end handstring.chop! handstring.chop! end def trump=(newtrump) @trump = newtrump @cards.each {|c| c.trump = newtrump} end attr_accessor :cards attr_reader :trump end if __FILE__ == $0 until (trumpline = readline()) != "" end case trumpline.downcase[0,1] when 'h' trump = :hearts when 'd' trump = :diamonds when 'c' trump = :clubs when 's' trump = :spades else raise StandardError, "Bad Input" end h = Hand.new(trump) 5.times do |t| cardline = readline() h.add_card(cardline) end puts trump.to_s.capitalize h.display end