From: James Edward Gray II Date: 2006-08-28T09:03:46+09:00 Subject: Fwd: Please Forward: Ruby Quiz Submission --Apple-Mail-1-175078844 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Begin forwarded message: > From: Ken Bloom > Date: August 27, 2006 12:51:01 PM CDT > To: submission@rubyquiz.com > Subject: Please Forward: Ruby Quiz Submission > > This is a recursive solution that runs in linear time (well, after > sorting). > > --Ken Bloom > > -- > Ken Bloom. PhD candidate. Linguistic Cognition Laboratory. > Department of Computer Science. Illinois Institute of Technology. > http://www.iit.edu/~kbloom1/ --Apple-Mail-1-175078844 Content-Transfer-Encoding: 7bit Content-Type: text/plain; x-unix-mode=0666; name=dayrange.rb Content-Disposition: attachment; filename=dayrange.rb NAMEMAP={"Mon"=>1,"Tue"=>2,"Wed"=>3,"Thu"=>4,"Fri"=>5,"Sat"=>6,"Sun"=>7,"Thurs"=>4, "Monday"=>1,"Tuesday"=>2,"Wednesday"=>3,"Thursday"=>4, "Friday"=>5,"Saturday"=>6,"Sunday"=>7} REVERSENAMEMAP=[nil,"Mon","Tue","Wed","Thu","Fri","Sat","Sun"] } def dayrange(*args) args.collect!{|x| NAMEMAP[x] || x} raise ArgumentError if args.any?{|x| not x.is_a?(Fixnum) or not (1..7).include?(x)} class << args def combine!(idx) return if idx>=length-1 if x=combineelements(self[idx],self[idx+1]) self[idx]=x self.delete_at(idx+1) combine! idx end end def combineelements(elem1,elem2) if elem1.is_a?(Range) and elem1.last+1==elem2 ((elem1.first)..elem2) elsif elem1.is_a?(Numeric) and elem1+1==elem2 (elem1..elem2) else nil end end end args.sort!.uniq! x=0 while x < args.length args.combine!(x) x+=1 end args.collect do |x| if x.is_a? Range and x.first+1==x.last [REVERSENAMEMAP[x.first],REVERSENAMEMAP[x.last]] elsif x.is_a? Range REVERSENAMEMAP[x.first]+"-"+REVERSENAMEMAP[x.last] else REVERSENAMEMAP[x] end end.flatten.join(",") end dayrange(1,2,3,5,7) --Apple-Mail-1-175078844 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed --Apple-Mail-1-175078844--