答案:時間帯重複チェック

 お題:時間帯重複チェック - No Programming, No Lifeより。
 お題をみてすぐにdatetimeモジュールが思い浮かんだのですが、他の答案では使用していませんねぇ。何か理由があんのかな?
 unittestモジュールによるテストファーストを実践。どうせテストケースはあとで考えなあかんから、最初に考えといて試験しながら作ったほうが結果的に工数は減るんかなと思った。
 Pythonは「○○以上××以下」などがシンプルに書けるから好き。not演算子も好き。

# -*- coding: utf-8 -*-
# http://d.hatena.ne.jp/fumokmm/20110326/1301146382

import datetime
import unittest

class TimeDuplecationCheckTestCase(unittest.TestCase):
    def testTimeDuplicationCheck(self):
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (-1, 0, 0, 0), (0, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (25, 0, 0, 0), (0, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, -1, 0, 0), (0, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 60, 0, 0), (0, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (24, 1, 0, 0), (0, 0, 0, 0))
        
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, -1, 0), (0, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 25, 0), (0, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, -1), (0, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 60), (0, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 24, 1), (0, 0, 0, 0))
        
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (-1, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (25, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (0, -1, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (0, 60, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (24, 1, 0, 0))

        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (0, 0, -1, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (0, 0, 25, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (0, 0, 0, -1))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (0, 0, 0, 60))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (0, 0, 24, 1))

        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 1, 0, 0), (0, 0, 0, 0))
        self.assertRaises(ValueError, timeDuplicationCheck,
                          (0, 0, 0, 0), (0, 1, 0, 0))

        self.assertFalse(timeDuplicationCheck((0, 0, 24, 0), (24, 0, 24, 0)))
        self.assertTrue(timeDuplicationCheck((0, 0, 24, 0), (0, 1, 23, 59)))
        self.assertFalse(timeDuplicationCheck((1, 0, 5, 30), (9, 0, 23, 0)))
        self.assertFalse(timeDuplicationCheck((1, 0, 2, 0), (2, 0, 3, 0)))
        self.assertTrue(timeDuplicationCheck((1, 0, 2, 1), (1, 59, 3, 0)))

        return


def timeDuplicationCheck(period1, period2):
    validatePeriod(period1)
    validatePeriod(period2)
    time1 = createTime(period1[2], period1[3])
    time2 = createTime(period2[0], period2[1])
    return time2 < time1


def createTime(hour, minute):
    today = datetime.datetime.today()
    if hour == 24 and minute == 0:
        tomorrow = today + datetime.timedelta(days=1)
        return datetime.datetime(tomorrow.year, tomorrow.month, tomorrow.day,
                                 0, 0)
    return datetime.datetime(today.year, today.month, today.day,
                             hour, minute)

def validatePeriod(period):
    if not isinstance(period, tuple):
        raise ValueError
    if not 4 == len(period):
        raise ValueError
    for value in period:
        if not isinstance(value, int):
            raise ValueError
    if not 0 <= period[0] <= 24:
        raise ValueError
    if not 0 <= period[1] <= 59:
        raise ValueError
    if not 0 <= period[2] <= 24:
        raise ValueError
    if not 0 <= period[3] <= 59:
        raise ValueError
    if 24 == period[0] and not 0 == period[1]:
        raise ValueError
    if 24 == period[2] and not 0 == period[3]:
        raise ValueError
    time1 = createTime(period[0], period[1])
    time2 = createTime(period[2], period[3])
    if time2 < time1:
        raise ValueError
    return
    

def main():
    unittest.main()

if __name__ == '__main__':
    main()

 24時0分に対応できていないかも。かったので修正。