-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
final solution: finds total days between given dates
- Loading branch information
1 parent
85984ee
commit b05ec19
Showing
1 changed file
with
84 additions
and
0 deletions.
There are no files selected for viewing
84 changes: 84 additions & 0 deletions
84
Udacity Data Structure and Algorithms Nanodegree/Introduction/daysBetweenDatesFinal.py
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
|
||
# Use Dave's suggestions to finish your daysBetweenDates | ||
# procedure. It will need to take into account leap years | ||
# in addition to the correct number of days in each month. | ||
|
||
|
||
def leapYear(year): | ||
if year % 400 == 0: | ||
return True | ||
if year % 100 == 0: | ||
return False | ||
if year % 4 == 0: | ||
return True | ||
return False | ||
|
||
|
||
def daysInMonth(year, month): | ||
if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12: | ||
return 31 | ||
else: | ||
if month == 2: | ||
if leapYear(year): | ||
return 29 | ||
else: | ||
return 28 | ||
else: | ||
return 30 | ||
|
||
|
||
def nextDay(year, month, day): | ||
"""Simple version: assume every month has 30 days""" | ||
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() |