The three rules of Ruby Q.:
-
Please do not post any solutions or spoiler discussion for this quiz
until
48 hours have passed from the time on this message. -
Support Ruby Q. by submitting ideas as often as you can:
- Enjoy!
Suggestion: A [QUIZ] in the subject of emails about the problem helps
everyone
on Ruby T. follow the discussion. Please reply to the original quiz
message,
if you can.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
by François Beausoleil
The goal of this Ruby Q. is to make a Video Cassette Recorder program
manager.
The user is responsible for saying what times to record, and then the
VCR will
query the program manager regularly to determine if it should be
recording, and
if so, on which channel.
The interesting bit in this quiz is the conflict resolution.
Normally, users specify recording schedules such as this:
Monday to Friday, 3 PM to 4 PM, channel 8
Specific programs might overlap. Assuming the above program is active,
if the
user added this program:
Wednesday Nov 8, 3:30 PM to 5 PM, channel 12
We should record from 3 to 3:30 channel 8, then switch to channel 12,
and record
until 5 PM.
Another variation might be:
Thursday Nov 9, 3:30 PM to 4:30 PM, channel 8
In this case, the channel didn’t change, so we should just keep on
recording.
Interesting, optional features: fuzzy time (start a bit before and end a
bit
after the specific times, to catch shows starting early / ending late)
and
taking care of DST.
Your program manager must implement the following interface:
# 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); end
# Adds a new Program to the list of programs to record.
def add(program_details); end
Your task is to provide an implementation for the ProgramManager.
You can see the unit tests I used at:
http://www.rubyquiz.com/program_manager_test.rb