Counting Sundays

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

p19.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/python
# -*- coding: utf-8 -*-
def is_leap(year):
return year % 400 == 0 or year % 100 != 0 and year % 4 == 0
def count_days(year, month, day):
days = 0
for y in range(1900, year):
days += is_leap(y) and 366 or 365
thirties = [4, 6, 9, 11]
for m in range(1, month):
if m == 2:
days += is_leap(year) and 29 or 28
else:
days += m in thirties and 30 or 31
return days + day
def main():
count = 0
for year in range(1901, 2001):
for month in range(1, 13):
if count_days(year, month, 1) % 7 == 0:
count += 1
print count
if __name__ == '__main__':
main()
p19.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package main
import (
"fmt"
"math"
)
func is_leap(year int) bool {
return math.Mod(float64(year), 400) == 0 || math.Mod(float64(year), 100) != 0 && math.Mod(float64(year), 4) == 0
}
func count_days(year, month, day int) int {
days := 0
for y := 1900; y < year; y++ {
if is_leap(y) {
days += 366
} else {
days += 365
}
}
for m := 1; m < month; m++ {
if m == 2 {
if is_leap(year) {
days += 29
} else {
days += 28
}
} else {
if m == 4 || m == 6 || m == 9 || m == 11 {
days += 30
} else {
days += 31
}
}
}
return days + day
}
func main() {
count := 0
for year := 1901; year < 2001; year++ {
for month := 1; month < 13; month++ {
if math.Mod(float64(count_days(year, month, 1)), 7) == 0 {
count++
}
}
}
fmt.Println(count)
}

I’m the 65183rd person to have solved this problem.