My solution..., I've spent an extra 10 minutes to put the code into a  
class.

http://pastie.caboo.se/69806

#! /usr/bin/ruby
#
# usage: $> ruby quiz#127.rb <width> <rows> <color_width>
# without args it prints carpet of 100*200 with color_width 5.

class MexicanCarpet
   COLORS = %w(W Y G W B)

   def initialize(width, rows, color_width)
     @width, @rows, @color_width = width, rows, color_width
     total_width = @width * @rows

     @color_stack = ""

     # make one long line of colors
     (COLORS.length-1).times do |i|
       color1 = COLORS[i]
       color2 = COLORS[i+1]

       color_width.times do |i|
         @color_stack << color1 * (@color_width-i)
         @color_stack << color2 * (i + 1) if i < @color_width - 1
       end
     end

     while total_width > @color_stack.length do
       @color_stack_ = @color_stack_ ? @color_stack_.reverse :  
@color_stack[5..-1].reverse
       @color_stack += (@color_stack[-2..-2] * @color_width) +  
@color_stack_
     end

     @color_stack << COLORS.last * @color_width
     print_carpet
   end

   def print_carpet
     # print slices of the color_stack
     @rows.times do |row|
       puts @color_stack[row..row+@width]
     end
   end

end

width       = ARGV[0] ? ARGV[0].to_i : 100
rows        = ARGV[1] ? ARGV[1].to_i : 200
color_width = ARGV[2] ? ARGV[2].to_i : 5

MexicanCarpet.new( width, rows, color_width )