Thank God It’s Friday!
June 24, 2011
The function for Gauss’ method is shown below. We changed the decimals to fractions so that all the calculations would be done in exact arithmetic.
(define (day-of-week year month day) ; gauss method
(let* ((yr (if (< month 3) (- year 1) year))
(m (if (< month 3) (+ month 10) (- month 2)))
(y (modulo yr 100)) (c (quotient yr 100)))
(list-ref '(sun mon tue wed thu fri sat)
(modulo (+ day (floor (- (* 13/5 m) 1/5)) y
(quotient y 4) (quotient c 4) (- (* 2 c))) 7))))
> (day-of-week 2011 6 24)
fri
Here is our version of Sakamoto’s method:
(define (day-of-week year month day) ; sakamoto method
(let ((t (vector 0 3 2 5 0 3 5 1 4 6 2 4))
(y (if (< month 3) (- year 1) year)))
(list-ref '(sun mon tue wed thu fri sat)
(modulo (+ day y (quotient y 4) (- (quotient y 100))
(quotient y 400) (vector-ref t (- month 1))) 7))))
> (day-of-week 2011 6 24)
fri
Conway’s method is more of a challenge. Here is the calculation of the anchor day:
(define (anchor year)
(let ((c (+ (quotient year 100) 1)))
(list-ref '(sun mon tue wed thu fri sat)
(modulo (+ (* 5 c) (quotient (- c 1) 4) 4) 7))))
> (anchor 2011)
tue
Given an anchor day, here is the function to calculate the doomsday:
(define (doomsday year)
(let* ((days '(sun mon tue wed thu fri sat))
(y (modulo year 100))
(q (quotient y 12))
(r (remainder y 12))
(x (quotient r 4))
(c (+ (quotient year 100) 1))
(anchor (+ (* 5 c) (quotient (- c 1) 4) 4)))
(list-ref days (modulo (+ q r x anchor) 7))))
> (doomsday 2011)
mon
It is easier for a computer, though perhaps not for a mentalist, to calculate the doomsday like this:
(define (doomsday year)
(list-ref '(sun mon tue wed thu fri sat)
(modulo (+ 2 year (quotient year 4)
(- (quotient year 100)) (quotient year 400)) 7)))
> (doomsday 2011)
mon
You can run the program at http://programmingpraxis.codepad.org/BeTpy03N, which also includes the code for the method from the Standard Prelude and Zeller’s congruence for comparison. Note that Zeller’s congruence is essentially the same as Gauss’ method.
[…] today’s Programming Praxis exercise, our goal is to implement three functions related to dates: two ways to […]
My Haskell solution (see http://bonsaicode.wordpress.com/2011/06/24/programming-praxis-thank-god-it%E2%80%99s-friday/ for a version with comments):
My Python submission (basically just a translation of the Scheme solution):
Python version
Tried all the formulas from Wikipedia for conway’s method. And went all the way to calculate the day of the week.
Here’s my solution in Java: