Begin forwarded message: > From: "Dan Weinand" <dweinand / gmail.com> > Date: November 11, 2006 7:17:59 PM CST > To: submission / rubyquiz.com > Subject: Please Forward: Ruby Quiz Submission > > Here is my submission for the VCR Manager. It should pass all of the > provided unit tests. > > -- Dan Weinand > > --- > program_manager.rb > --- > > class ProgramManager > # Query to determine if we should be recording at any particular > # moment. It can be assumed that the VCR will query the program > # manager at most twice per minute, and with always increasing > minutes. > # New programs may be added between two calls to #record?. > # > # This method must return either a +nil+, indicating to stop > recording, > # or don't start, or an +Integer+, which is the channel number we > should > # be recording. > def record?(time) > secs = convert_to_secs(time) > specific_programs = @programs.select {|p| p.specific? && > p.starts_at <= time && p.ends_at >= time} > weekly_programs = @programs.select {|p| p.weekly? && p.starts_at > <= secs && p.ends_at >= secs && p.days.include?(time.strftime("%a")) } > if !specific_programs.empty? > specific_programs.last.channel > elsif !weekly_programs.empty? > weekly_programs.last.channel > end > end > > # Adds a new Program to the list of programs to record. > def add(program_details) > @programs ||= [] > program = Program.new > program.starts_at = program_details[:start].is_a?(Time) ? > program_details[:start] : program_details[:start].to_i > program.ends_at = program_details[:end].is_a?(Time) ? > program_details[:end] : program_details[:end].to_i > program.channel = program_details[:channel].to_i > program.days = program_details[:days] ? > program_details[:days].collect {|d| d.capitalize} : [] > @programs << program > end > > protected > > # Converts a time object to the number of seconds since midnight > def convert_to_secs(time) > ((time.hour*60)*60) + (time.min*60) + time.sec > end > end > > --- > program.rb > --- > > class Program > attr_accessor :starts_at, :ends_at, :channel, :days > > # Specific programs use Time objects representing a specific date > def specific? > starts_at.is_a?(Time) && ends_at.is_a?(Time) > end > > # Weekly programs use Fixnum objects representing the number of > seconds from midnight > def weekly? > starts_at.is_a?(Fixnum) && ends_at.is_a?(Fixnum) > end > end > > ---