Problem 19

You are given the following information, but you may prefer to do some research for yourself.

1 Jan 1900 was a Monday.
Thirty days has September,
April, June and November.
All the rest have thirty-one,
Saving February alone,
Which has twenty-eight, rain or shine.
And on leap years, twenty-nine.
A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.

How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?

Solution 1

def isleap(year):
    if not year%100:
        if not year%400:
            return 29
        return 28
    if not year%4:
        return 29
    return 28

ans = 0
days = sum([31,isleap(1900),31,30,31,30,31,31,30,31,30,31])

for y in range(1, 101):
    month = 0
    for m in [0,31,isleap(1900+y),31,30,31,30,31,31,30,31,30]:
        month += m
        if not (days+1+month)%7:
            ans += 1

    days += sum([31,isleap(1900+y),31,30,31,30,31,31,30,31,30,31])