day year month date
 = ["Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
   !!
   ((centurypart + leappart + yearpart + monthpart + date + premature) `mod` 7)
   where
    centurypart = [6,4,2,0] !! ((year `div` 100) `mod` 4)
    leappart    = ((year `mod` 100) `trunc` 4) `div` -2
                  where a `trunc` b = b * (a `div` b)
    yearpart    = year `mod` 4
    monthpart   = [1,4,4,0,2,5,0,3,6,1,4,6] !! (month-1)
    premature   | (month <= 2) && (year `mod` 4 == 0)
                    && (year `mod` 100 /= 0 || year `mod` 400 == 0) = -1
                | otherwise                                         =  0
