From: Robin Stocker Date: 2005-11-21T05:21:32+09:00 Subject: Re: [QUIZ SOLUTION] Euchre Hands (#55) James Edward Gray II wrote: > Just FYI, this solution seems to have trouble with certain inputs: Ah, thank you... I just noticed that I forgot the queen in my Faces array :) I also updated the script to get the alternating colors right. Thanks for finding this (stupid) error. Robin Stocker module Euchre class Hand attr_accessor :cards def initialize( trump ) @cards = [] @trump = Card.new( trump ) end def <<( card ) @cards << card end def sort! second_suit = @cards.find{ |c| !trump_color?(c) }.suit @cards = # First the trump jack.. @cards.select{ |c| trump_suit?(c) and c.jack? } | # then the jack of the trump color.. @cards.select{ |c| trump_color?(c) and c.jack? } | # then all the trump cards.. @cards.select{ |c| trump_suit?(c) }.sort.reverse | # then a different color, so the colors alternate.. @cards.select{ |c| c.suit == second_suit }.sort.reverse | # then the cards with the same color as the trump.. @cards.select{ |c| trump_color?(c) }.sort.reverse | # and finally the rest. @cards.sort.reverse end def trump_suit?( card ) card.suit == @trump.suit end def trump_color?( card ) card.color == @trump.color end def to_s @cards.join("\n") end end class Card attr_accessor :suit, :face Suits = ['d', 'h', 'c', 's'] Faces = ['9', 'T', 'Q', 'J', 'K', 'A'] Colors = {'d' => :red, 'h' => :red, 'c' => :black, 's' => :black} def initialize( suit, face=nil ) @suit = suit.downcase @face = face.upcase if face end def jack?() @face == 'J' end def color() Colors[@suit] end # Sort first by suit and then by face. def <=>( other ) rel = Suits.index(@suit) - Suits.index(other.suit) rel = Faces.index(@face) - Faces.index(other.face) if rel == 0 rel end def to_s @face + @suit end end end if __FILE__ == $0 lines = readlines trump = lines.shift.slice(/\w+/) hand = Euchre::Hand.new(trump[0,1]) lines.join.scan(/(\w)(\w)/) do |face, suit| hand << Euchre::Card.new(suit, face) end hand.sort! puts trump puts hand end