#### Problem

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

open System let ans = [1901..2000] |> List.collect (fun y -> [1..12] |> List.map (fun m -> new DateTime(y, m, 1))) |> List.filter (fun d -> d.DayOfWeek = DayOfWeek.Sunday) |> List.length

The solution here is simple, for the *int list* *[1901..2000]* generates the Cartesian product with the* int list [1..12]* to get a *DateTime* object representing the first day in each month from 1901 to 2000, e.g.

From this point, all that’s left is to filter the list of *DateTime* values to find the ones which represent a Sunday and count them.

open System

let p19 = [for y in 1901..2000 do

for m in 1..12 do yield new DateTime(y,m,1)]

|> List.filter (fun d -> d.DayOfWeek = DayOfWeek.Sunday)

|> List.length