Problem 019: Counting Sundays

From Project Euler:

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)?

Date math is never fun, so we'll just use a built-in library. We'll start off in January 1901 and count our way up through the months, adding to a tally if the first of the month is a Sunday:
(use '[java-time :only [local-date sunday?]])

(defn count-sundays []
  (loop [year 1901
         month 1
         total 0]
    (if (== year 2001)
      total
      (let [today (local-date year month)]
        (recur (+ year (if (== 11 month) 1 0))
               (if (== 12 month) 1 (+ month 1))
               (+ total (if (sunday? today) 1 0))))))
This runs pretty quick:
$ lein run
Processing...
171
"Elapsed time: 136.869657 msecs"

No comments:

Post a Comment