Problem 19

(defvar month-day-alist '((1 . 31)
			  (2 . 28)
			  (3 . 31)
			  (4 . 30)
			  (5 . 31)
			  (6 . 30)
			  (7 . 31)
			  (8 . 31)
			  (9 . 30)
			  (10 . 31)
			  (11 . 30)
			  (12 . 31)))

(defun assq-val (key alist)
  (cdr (assq key alist)))


(defun next-month (year month day)
  (let ((days (assq-val month month-day-alist)))
    (if (eq month 2)
	(if (or (eq (% year 400) 0)
		(and (not (eq (% year 100) 0))
		     (eq (% year 4) 0))) ; leap year
	    (setq days (1+ days)) ))
    (if (eq month 12)
	(progn
	  (setq year (1+ year))
	  (setq month 1) )
      (setq month (1+ month)) )
    (setq day (% (+ day days) 7))
    (list year month day) ))

(let ((year-month-day '(1900 1 1)) (sum 0))
  (while (not (eq (car year-month-day) 1901))
    (setq year-month-day (apply #'next-month year-month-day)) )
  (while (not (eq (car year-month-day) 2001))
    (if (eq (nth 2 year-month-day) 0)
	(setq sum (1+ sum)) )
    (setq year-month-day (apply #'next-month year-month-day)) )
  (princ sum)
  (princ "\n") )