I'll add my (partial, again) solution...  I didn't get a whole lot of
time to work on it, despite having written the original proposal. But
it was fun, so I may work a bit more on it.  In any case, just to add
my ideas and approach, my current code determines the rank of each
hand, but that's it -- didn't get to refactoring and determining the
actual winner or sorting cards, checking high, kickers, etc.

#!/usr/bin/env ruby

SUITS = %w(c d h s)
FACES = %w(A K Q J T 9 8 7 6 5 4 3 2)

RANKS = {
  :royal_flush     => 'Royal Flush',
  :straight_flush  => 'Straight Flush',
  :four_of_a_kind  => 'Four of a Kind',
  :full_house      => 'Full House',
  :flush           => 'Flush',
  :straight        => 'Straight',
  :three_of_a_kind => 'Three of a Kind',
  :two_pair        => 'Two Pair',
  :pair            => 'Pair',
  :high_card       => 'High Card',
  :fold            => ''
}

class Hand
  def initialize(line)
    @cards = line.split

    @faces = Hash.new { [] }
    @suits = Hash.new { [] }
    @count = Hash.new { [] }

    @cards.each do |card|
      f = FACES.index(card[0].chr)
      s = SUITS.index(card[1].chr)
      @faces[f] = @faces[f] << s
      @suits[s] = @suits[s] << f
    end

    @faces.keys.each do |face|
      n = @faces[face].size
      @count[n] = @count[n] << face
    end

    @rank = rank_hand
  end

  def rank_hand
    return :fold if @cards.size < 7

    return :royal_flush if @suits.keys.any? do |suit|
      (0..5).all? do |face|
        @suits[suit].include? face
      end
    end

    return :straight_flush if @suits.keys.any? do |suit|
      high = @suits[suit].min
      (high..high+5).all? do |face|
        @suits[suit].include? face
      end
    end

    return :four_of_a_kind if not @count[4].empty?

    return :full_house if @count[3].size == 2 or (@count[3].size == 1
and not @count[2].empty?)

    return :flush if @suits.keys.any? do |suit|
      @suits[suit].size >= 5
    end

    return :straight if @faces.keys.any? do |high|
      (high..high+5).all? do |face|
        @faces.keys.include? face
      end
    end

    return :three_of_a_kind if @count[3].size == 1

    return :two_pair if @count[2].size >= 2

    return :pair if @count[2].size == 1

    :high_card
  end

  attr_reader :cards, :rank
end


def main
  hands = $<.collect { |l| Hand.new(l.chomp) }
  hands.each do |h|
    puts "#{h.cards.join(' ')}  #{RANKS[h.rank]}"
  end
end

main