Created
November 28, 2016 12:28
-
-
Save akueisara/63b638f5d74d9d77afddc624e0a5163f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def isLeapYear(year): | |
# From Wikipedia http://en.wikipedia.org/wiki/Leap_year | |
""" | |
if (year is not exactly divisible by 4) then (it is a common year) | |
else | |
if (year is not exactly divisible by 100) then (it is a leap year) | |
else | |
if (year is not exactly divisible by 400) then (it is a common year) | |
else (it is a leap year) | |
""" | |
if year % 400 == 0: | |
return True | |
if year % 100 == 0: | |
return False | |
if year % 4 == 0: | |
return True | |
else: | |
return False | |
def daysInMonth(year, month): | |
if month in (1, 3, 5, 7, 8, 10, 12): | |
return 31 | |
else: | |
if month == 2: | |
if isLeapYear(year): | |
return 29 | |
else: | |
return 28 | |
else: | |
return 30 | |
def nextDay(year, month, day): | |
if day < daysInMonth(year, month): | |
return year, month, day + 1 | |
else: | |
if month == 12: | |
return year + 1, 1, 1 | |
else: | |
return year, month + 1, 1 | |
def dateIsBefore(year1, month1, day1, year2, month2, day2): | |
"""Returns True if year1-month1-day1 is before year2-month2-day2. Otherwise, returns False.""" | |
if year1 < year2: | |
return True | |
if year1 == year2: | |
if month1 < month2: | |
return True | |
if month1 == month2: | |
return day1 < day2 | |
return False | |
def daysBetweenDates(year1, month1, day1, year2, month2, day2): | |
"""Returns the number of days between year1/month1/day1 | |
and year2/month2/day2. Assumes inputs are valid dates | |
in Gregorian calendar.""" | |
# program defensively! Add an assertion if the input is not valid! | |
assert not dateIsBefore(year2, month2, day2, year1, month1, day1) | |
days = 0 | |
while dateIsBefore(year1, month1, day1, year2, month2, day2): | |
year1, month1, day1 = nextDay(year1, month1, day1) | |
days += 1 | |
return days | |
def test(): | |
test_cases = [((2012,1,1,2012,2,28), 58), | |
((2012,1,1,2012,3,1), 60), | |
((2011,6,30,2012,6,30), 366), | |
((2011,1,1,2012,8,8), 585 ), | |
((1900,1,1,1999,12,31), 36523)] | |
for (args, answer) in test_cases: | |
result = daysBetweenDates(*args) | |
if result != answer: | |
print "Test with data:", args, "failed" | |
else: | |
print "Test case passed!" | |
test() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment