From: Zed Lopez Date: 2005-11-21T11:37:24+09:00 Subject: Re: Euchre Hands (#55) Terse, but almost reasonable version: class Euchre OTHER_COLOR = {'c' => 's', 's' => 'c', 'h' => 'd', 'd' => 'h'} attr_reader :trump_suit def initialize(suit_name) @trump_suit = suit_name @trump = @trump_suit[0,1].downcase end def <<(card) (@hand ||= []) << card end def hand suits = @hand.map {|card| card[1,1]}.uniq i = suits.index(@trump) and suits.push(suits.slice!(i)) suits[-3],suits[-2] = suits[-2],suits[-3] if suits.length > 2 and OTHER_COLOR[suits[-1]] == suits[-2] @hand.sort_by do |x| rank, suit = x.split('') if rank == 'J' and @trump == suit : 50 elsif rank == 'J' and OTHER_COLOR[suit] == @trump : 40 else '9TJQKA'.index(rank) + suits.index(suit)*10 end end.reverse end end euchre = Euchre.new(gets.strip) 5.times { euchre << gets.strip } puts euchre.trump_suit, euchre.hand Golfed, but weighing in a good 80 characters more than Ryan's (but, hey, it's my first golf outing in Ruby.) Like his, it should be one line. a=[];6.times{a<2&&o[s[-1]]==s[-2]&&(s[-3],s[-2]=s[-2],s[-3]);puts a.sort_by{|c|r,z=c.upcase.split('');r=='J'&&t==z&&50||r=='J'&&o[z]==t&&40||'9TJQKA'.index(r)+s.index(z)*9}.reverse