From: Ruby Quiz Date: 2007-10-19T21:14:00+09:00 Subject: [QUIZ] Time Window (#144) The three rules of Ruby Quiz: 1. Please do not post any solutions or spoiler discussion for this quiz until 48 hours have passed from the time on this message. 2. Support Ruby Quiz by submitting ideas as often as you can: http://www.rubyquiz.com/ 3. Enjoy! Suggestion: A [QUIZ] in the subject of emails about the problem helps everyone on Ruby Talk follow the discussion. Please reply to the original quiz message, if you can. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= by Brian Candler Write a Ruby class which can tell you whether the current time (or any given time) is within a particular "time window". Time windows are defined by strings in the following format: # 0700-0900 # every day between these times # Sat Sun # all day Sat and Sun, no other times # Sat Sun 0700-0900 # 0700-0900 on Sat and Sun only # Mon-Fri 0700-0900 # 0700-0900 on Monday to Friday only # Mon-Fri 0700-0900; Sat Sun # ditto plus all day Sat and Sun # Fri-Mon 0700-0900 # 0700-0900 on Fri Sat Sun Mon # Sat 0700-0800; Sun 0800-0900 # 0700-0800 on Sat, plus 0800-0900 on Sun Time ranges should exclude the upper bound, i.e. 0700-0900 is 07:00:00 to 08:59:59. An empty time window means "all times everyday". Here are some test cases to make it clearer: class TestTimeWindow < Test::Unit::TestCase def test_window_1 w = TimeWindow.new("Sat-Sun; Mon Wed 0700-0900; Thu 0700-0900 1000-1200") assert ! w.include?(Time.mktime(2007,9,25,8,0,0)) # Tue assert w.include?(Time.mktime(2007,9,26,8,0,0)) # Wed assert ! w.include?(Time.mktime(2007,9,26,11,0,0)) assert ! w.include?(Time.mktime(2007,9,27,6,59,59)) # Thu assert w.include?(Time.mktime(2007,9,27,7,0,0)) assert w.include?(Time.mktime(2007,9,27,8,59,59)) assert ! w.include?(Time.mktime(2007,9,27,9,0,0)) assert w.include?(Time.mktime(2007,9,27,11,0,0)) assert w.include?(Time.mktime(2007,9,29,11,0,0)) # Sat assert w.include?(Time.mktime(2007,9,29,0,0,0)) assert w.include?(Time.mktime(2007,9,29,23,59,59)) end def test_window_2 w = TimeWindow.new("Fri-Mon") assert ! w.include?(Time.mktime(2007,9,27)) # Thu assert w.include?(Time.mktime(2007,9,28)) assert w.include?(Time.mktime(2007,9,29)) assert w.include?(Time.mktime(2007,9,30)) assert w.include?(Time.mktime(2007,10,1)) assert ! w.include?(Time.mktime(2007,10,2)) # Tue end def test_window_nil w = RDS::TimeWindow.new("") assert w.include?(Time.mktime(2007,9,25,1,2,3)) # all times end end