Udacity完成daysBetweenDates回答可能是错误的

时间:2018-01-14 03:41:27

标签: python

本课可能存在错误。

我正在努力向前推进而无需观看daysBetweenDates测验的答案视频。

长话短说: 我想出了代码,它适用于所有测试用例,除了一个。 这个错误很奇怪。根据Udacity,我得到的日期和答案之间的天数之间的差异。我的想法是,如果我的代码中出现错误,我得到的答案和Udacity的预期答案之间的差异将超过1,因为错误应该重复出现。

我尝试使用不同的方法计算日期之间的天数。我得到了我的程序计算的数字。

所以问题是,是1900,1,1和1999,12之间的日期天数,31真的是36523(Udacity的答案)或36524(我的答案)

这是我的完整代码

我建议您在口译员处尝试检查Udacity对最后一个测试用例的答案是否正确。

# Credit goes to Websten from forums
#
# 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.

number_of_days_in_month = 30

def nextDay(year, month, day):
    """Simple version: assume every month has 30 days"""
    number_of_days_in_month = setDaysInMonth(month, year)
    if day < number_of_days_in_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)
    number_of_days_between_dates = 0
    while dateIsBefore(year1, month1, day1, year2, month2, day2):
        year1, month1, day1 = nextDay(year1, month1, day1)
        number_of_days_between_dates += 1
    print number_of_days_between_dates
    return number_of_days_between_dates



def setDaysInMonth(month1, year1):
    if isLeapYear(year1) == False:
        if month1 == 1:
            number_of_days_in_month = 31
        if month1 == 3:
            number_of_days_in_month = 31
        if month1 == 5:
            number_of_days_in_month = 31
        if month1 == 7:
            number_of_days_in_month = 31
        if month1 == 8:
            number_of_days_in_month = 31
        if month1 == 10:
            number_of_days_in_month = 31
        if month1 == 12:
            number_of_days_in_month = 31
        if month1 == 4:
            number_of_days_in_month = 30
        if month1 == 6:
            number_of_days_in_month = 30
        if month1 == 9:
            number_of_days_in_month = 30
        if month1 == 11:
            number_of_days_in_month = 30
        if month1 == 2:
            number_of_days_in_month = 28
        return number_of_days_in_month
    else:
        if month1 == 1:
            number_of_days_in_month = 31
        if month1 == 3:
            number_of_days_in_month = 31
        if month1 == 5:
            number_of_days_in_month = 31
        if month1 == 7:
            number_of_days_in_month = 31
        if month1 == 8:
            number_of_days_in_month = 31
        if month1 == 10:
            number_of_days_in_month = 31
        if month1 == 12:
            number_of_days_in_month = 31
        if month1 == 4:
            number_of_days_in_month = 30
        if month1 == 6:
            number_of_days_in_month = 30
        if month1 == 9:
            number_of_days_in_month = 30
        if month1 == 11:
            number_of_days_in_month = 30
        if month1 == 2:
            number_of_days_in_month = 29
        return number_of_days_in_month

def isLeapYear(year1):
    if year1 % 4 == 0:
        return True
    return False

def numberOfLeapYears(year1, year2):
    number_of_leap_years = 0

    while year1 < year2:
        if year1 % 4 == 0:
            number_of_leap_years += 1
            year1 += 1
        else:
            year1 += 1
    #print "number of leap years: " + str(number_of_leap_years)
    return number_of_leap_years

def numberOfNonLeapYears(year1, year2):
    number_of_non_leap_years = 0
    while year1 < year2:
        if year1 % 4 == 0:            
            year1 += 1
        else:
            number_of_non_leap_years += 1
            year1 += 1
    #print "number of non leap years: " + str(number_of_non_leap_years)
    return number_of_non_leap_years


def numberOfDays(year1, year2):
    number_of_leap_years = numberOfLeapYears(year1, year2)
    print number_of_leap_years
    number_of_non_leap_years = numberOfNonLeapYears(year1, year2)
    print number_of_non_leap_years
    number_of_days = 0
    number_of_days = number_of_leap_years * 366 + number_of_non_leap_years * 365
    #print number_of_days
    return number_of_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),
                  ((1900,1,1,1910,1,1), 3653)]

    for (args, answer) in test_cases:
        result = daysBetweenDates(*args)
        if result != answer:
            print "Test with data:", args, "failed"
        else:
            print "Test case passed!"

test()

#print isLeapYear(1900)
#print 366*3 + 365*7
#print numberOfLeapYears(1900, 1999)
#print numberOfNonLeapYears(1900, 1999)
print numberOfDays(1900, 2000)

1 个答案:

答案 0 :(得分:0)

您正在使用闰年的幼稚测试(%4)。但是,闰年还有其他规则。

闰年是可以被4整除的年份,除非它可被100整除(那么它不是闰年),除非它可以被400整除(那么它是闰年)。

因此,1500,1700,1800,1900年没有飞跃年,但1600年和2000年是闰年。

一个简单的Python版本:

def is_leap_year(year):
    if year % 400 == 0:
        return True
    if year % 4 == 0 and not year % 100 == 0:
        return True
    return False