Source

euler / clojure / 19.clj

; 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)?
; 
; Answer: 171

(ns e19
  (:import java.util.Calendar))

(def cal (Calendar/getInstance))

(def months 
  (for [year (range 1901 2001) month (range 1 13)]
    [year month]))

(defn make-calendar [year month]
  (doto cal
    (.clear)
    (.set year (dec month) 1)))

(defn pred [n]
  (let [c (apply make-calendar n)]
    (= (.get c Calendar/DAY_OF_WEEK) Calendar/SUNDAY)))

(prn (count (filter pred months)))