From: Warren Brown Date: 2005-11-21T17:00:49+09:00 Subject: [SOLUTION] Euchre Hands (#55) All, This quiz looked so simple I just couldn't resist putting in the short amount of time needed to solve it. Also, I love to play Euchre. I see other solutions trying very hard to make sure that two suits of the same color do not appear next to each other. As a Euchre player, I would be quite upset if the order of the suits changed during play. For example, if hearts were trump, and the hand is (9h 9s 9d 9c Tc), and the 9s is played, the hand should stay (9h 9d 9c Tc), not be reordered to (9h 9c Tc 9d). I tend to always keep my suits in the same order (s h c d) and simply rotate the order so that the trump suit is first (e.g. (c d s h) if clubs are trump). I also made sure the routine works with fewer (or more) than five cards since cards are actually played from the hand during a game. ---------------------------------------------------------------- # Constants RANKS = 'AKQJT9' SUITS = 'SHCD' def euchre_sort(cards) # Split out trump trump = cards.shift # Quick and dirty validation trump_index = SUITS.index(trump[0,1].upcase) unless trump_index puts "Invalid trump (#{trump})." exit end cards.each do |card| if card !~ /^[#{RANKS}][#{SUITS}]$/i puts "Invalid card (#{card})." exit end end # Return sorted hand right_bower = "J#{SUITS[trump_index,1]}" left_bower = "J#{SUITS[trump_index - 2,1]}" [trump] + cards.sort_by do |card| upcase_card = card.upcase case upcase_card when right_bower then -2 when left_bower then -1 else RANKS.index(upcase_card[0,1]) + 10 * ((SUITS.index(upcase_card[1,1]) - trump_index) % 4) end end end puts euchre_sort(STDIN.read.split) ---------------------------------------------------------------- This solution (minus error handling) is also very amenable to golfing at 187 characters: R='AKQJT9';S='shcd';i=$<.read.split;t=i.shift;x=S.index(t[0,1] .downcase);r="J#{S[x,1]}";l="J#{S[x-2,1]}";puts(t,i.sort_by{|c| c==r ?-2:c==l ?-1:R.index(c[0,1])+10*((S.index(c[1,1])-x)%4)}) - Warren Brown