Why does my code produce incorrect output?

  • Context: Python 
  • Thread starter Thread starter doktorwho
  • Start date Start date
  • Tags Tags
    Code Output Python
Click For Summary

Discussion Overview

The discussion revolves around a coding issue related to calculating the number of days between two dates, specifically focusing on the handling of leap years and historical calendar changes. Participants explore the implications of leap year rules and the Gregorian calendar's adoption.

Discussion Character

  • Technical explanation, Debate/contested, Historical

Main Points Raised

  • One participant reports that their code produces an incorrect output for the test case involving the dates 1900,1,1 and 1999,12,31, receiving an extra day.
  • Another participant points out that there are no leap years in years that are divisible by 100 unless they are also divisible by 400, which may explain the discrepancy.
  • Some participants discuss the historical context of leap years and calendar changes, referencing the Gregorian reform in 1582 and its uneven implementation across different countries.
  • There is mention of the transition from the Julian calendar to the Gregorian calendar and its impact on date calculations, particularly in relation to the missing days during the transition.

Areas of Agreement / Disagreement

Participants express differing views on the leap year rules and their application, with some acknowledging the complexities introduced by historical calendar changes. The discussion remains unresolved regarding the specific coding issue and its relation to these rules.

Contextual Notes

The discussion highlights limitations in the code's handling of leap years, particularly for century years, and the historical context of calendar reforms that may affect date calculations.

doktorwho
Messages
181
Reaction score
6
Python:
# 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 nextDay(year, month, day):
    n=month
    if (n==1 or n==3 or n==5 or n==7 or n==8 or n==10 or n==12) and day < 31:
        return year, month, day + 1
    if (n==4 or n==6 or n==9 or n==11) and day <30 :
        return year, month, day + 1
    if month==2 and day < 29 and (year%4)==0:
        return year, month, day + 1
    if month==2 and day < 28 and (year%4)!=0:
        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()

I am suppose to write a code that calculates the number of days between two dates and i get everything from the test correctly except the last one, 1900,1,1,199,12,31. I get +1 day, why is that?
 
Last edited by a moderator:
Technology news on Phys.org
Do you know that there are no leap years on the 100's that are not divisible by 400?
 
  • Like
Likes   Reactions: jedishrfu
Borg said:
Do you know that there are no leap years on the 100's that are not divisible by 400?
I did not know that, thanks :-)
 
jedishrfu said:
Also historically there was a calendar change in 1582 by Pope Gregory to fix the time of the vernal equinox which was 10 days too late:

http://www.findingdulcinea.com/news...this-Day--In-1582--Oct--5-Did-Not-Exist-.html
The change from the Julian calendar to the Gregorian calendar didn't happen uniformly in all countries. In Great Britain and the colonies (including what is now the U.S.), this change didn't occur until almost two centuries later, in September of 1752. Here's an image of a calendar from that year. Notice the jump from Sep 2 to Sep 14, with no dates shown for the intervening 11 days.
Sept_1752_calendar.jpg
 
  • Like
Likes   Reactions: jedishrfu

Similar threads

  • · Replies 34 ·
2
Replies
34
Views
6K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 18 ·
Replies
18
Views
2K
  • · Replies 10 ·
Replies
10
Views
1K
  • · Replies 11 ·
Replies
11
Views
1K
  • · Replies 15 ·
Replies
15
Views
2K
  • · Replies 28 ·
Replies
28
Views
5K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 11 ·
Replies
11
Views
2K
  • · Replies 7 ·
Replies
7
Views
5K