Hi,
You can find my solution below. The main trick is the order of programs
maintained by ProgramManager. The programs array contains specific
programs at the beginning (in the reversed order so that a program
added last is placed first), and then repeating programs in order of
their addition.
# program_manager.rb
class Time
def seconds
(hour * 60 + min) * 60 + sec
end
end
class Program
attr_reader :channel
def initialize(program_details)
@program_start = program_details[:start]
@program_end = program_details[:end]
@channel = program_details[:channel]
end
end
class SpecificProgram < Program
def record?(time)
time.between?(@program_start, @program_end)
end
end
class RepeatingProgram < Program
WEEKDAYS = %w(mon tue wed thu fri sat sun)
def initialize(program_details)
super
@days = program_details[:days].map {|day| WEEKDAYS.index(day) + 1}
end
def record?(time)
@days.include?(time.wday) && time.seconds.between?(@program_start,
@program_end)
end
end
class ProgramManager
def initialize()
@programs = []
end
def add(program_details)
case program_details[:start]
when Numeric
@programs << RepeatingProgram.new(program_details)
when Time
@programs[0, 0] = SpecificProgram.new(program_details)
end
self
end
def record?(time)
program = @programs.find {|program| program.record?(time)}
program ? program.channel : nil
end
end