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.