Please Forward: Ruby Quiz Submission

I tried to send this before, but it didn't seem to go through. Trying again. Sorry if this is a duplicate.

James Edward Gray II

···

Begin forwarded message:

From: st103@doc.ic.ac.uk
Date: August 29, 2006 5:37:24 AM CDT
To: submission@rubyquiz.com
Subject: Please Forward: Ruby Quiz Submission

Hi James. Here's my submission for number 92. Short, and reasonably sweet.

Regards,
Stuart

#a cute little helper method to do the hard work
class Array
  def split &blk
    #split the array into little arrays at boundary where block evals to true
    i=0
    r = []
    while i<length
      start=i
      loop do
        i+=1
        break if blk.call(at(i-1), at(i))
        if i==length-1
          i+=1
          break
        end
      end
      r << slice(start..i-1)
    end
    r
  end
end

# i personally don't really see the point of wrapping this up in a class
def dayrange *args
  r = []
  days = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']
  args.collect!{|d| days.include?(d) ? days.index(d) : d }
  raise ArgumentError.new("invalid arguments #{args.inspect} for dayrange")
unless (args - (0..6).to_a).empty?
  args.sort.split{|a,b| a.succ != b}.each{|d|
    if d.size>=3
      r << days[d[0]] + '-' + days[d[-1]]
    else
      r.concat d.collect{|n| days[n]}
    end
    }
  r.join(',')
end

#some examples
puts dayrange(0,2,3,4,6)
puts dayrange('Mon','Tue','Wed', 'Fri')
puts dayrange(0,'Tue',2,'Sat')
puts dayrange(4,2,5,1,3)