Recently in ruby Category

bridge hands in ruby

| No Comments
A little while ago I started looking at Ruby and Ruby on Rails. So far I like what I see. I'm doing a little address book app to try rails and for the ruby side I'm solving pretty much random finger exercises like this one: bridge hands.
#!/usr/local/bin/ruby -w

require "enumerator"

Card = Struct.new(:suit, :face)

IS_PLAYER = /^[SWNE]$/
IS_CARDS = /^([CDSH][2-9TJQKA])+$/

PLAYERS = %w{S W N E}
SUITS = %w{C D S H}
FACES = %w{2 3 4 5 6 7 8 9 T J Q K A}

deck = nil
dealer = 0

ARGF.each_line() do |line|
  line.chomp!
  next if line.empty?
  case line
  when IS_PLAYER
    deck = Array.new
    dealer = PLAYERS.index(line)
  when IS_CARDS   
    deck.concat( 
       line.enum_for(:each_byte).enum_slice(2).map do |sf|
           Card.new(sf[0], sf[1])
       end)
    if deck.size == 52 then
      # process deck
      hands = PLAYERS.inject(Hash.new) do |map, player| 
        map[player]= Array.new
        map
      end
      deck.enum_slice(4).each do |round|
        (0...4).each do |num| 
          hands[PLAYERS[(dealer + num + 1) % 4]] << round[num]
        end  
      end 
      PLAYERS.each do |player| 
        hands[player] = hands[player].sort_by do |card|
          SUITS.index(card.suit.chr) * FACES.size + 
             FACES.index(card.face.chr)
        end  
        puts hands[player].inject(player + ":") { |string, card|
           string + " " + card.suit.chr + card.face.chr
        }    
      end          
    end
  when "\#"
    Kernel.exit(0)
  else
    Kernel.exit(1)
  end    
end  


I'm still new in this ruby world so if you see some ruby idiom I'm missing or some awkward antipattern that I use feel free to correct me in comments.

About this Archive

This page is an archive of recent entries in the ruby category.

photos is the previous category.

running is the next category.

Find recent content on the main index or look in the archives to find all content.

Creative Commons License
This blog is licensed under a Creative Commons License.