【每日一题019】Counting Sundays
drracket吧
全部回复
仅看楼主
level 11
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)?
2014年04月11日 10点04分 1
level 11
;;;racket
;;;drracket
;;;每日一题019
;;;从19010101到20001231 每月第一天是周日的日子有多少
;;;已知19000101是周一
;-----------------
;;;已知日期和星期
(struct date (year month day week))
;-----------------------
;;;判断闰年
(define (leap-year? year)
(cond ((= 0 (remainder year 100))
(cond ((= 0 (remainder year 400))
#t)
(else
#f)))
((= 0 (remainder year 4))
#t)
(else
#f)))
;;;今天是今年的第几天
(define (days2year y m d)
(define month-data (vector 0 31 28 31 30 31 30 31 31 30 31 30 31))
(let ((leap (leap-year? y)))
(cond (leap
(vector-set! month-data 2 29))
(else
(vector-set! month-data 2 28))))
(let loop ((m (sub1 m)) (days d))
(cond ((= m 0) days)
(else
(loop (sub1 m)
(+ days
(vector-ref month-data m)))))))
;;;年与年之间的天数
;;;y-base 01-01 到 (sub1 y-now) 12-31
;;;y-base<=y-now
(define (days-y2y y-base y-now)
(let loop ((y y-base) (days 0))
(cond ((= y y-now) days)
((leap-year? y)
(loop (add1 y)
(+ 366 days)))
(else
(loop (add1 y)
(+ 365 days))))))
;;;年月日到年的天数
(define (days-ymd2y y-base y m d)
(+ (days2year y m d)
(days-y2y y-base y)))
;;;年月日到年月日的天数
(define (days-ymd2ymd y1 m1 d1 y2 m2 d2)
(let ((y-base (min y1 y2)))
(abs
(- (days-ymd2y y-base y2 m2 d2)
(days-ymd2y y-base y1 m1 d1)))))
;;;星期几
(define week-data (vector 'Sunday 'Monday 'Tuesday 'Wednesday 'Thursday 'Friday 'Saturday))
(define (day-week y m d)
;;;20000101-06
(define base-y 2000)
(define base-m 1)
(define base-d 1)
(define base-w 6)
;---------------
(cond ((>= y base-y)
(remainder
(+ base-w
(days-ymd2ymd y m d base-y base-m base-d))
7))
(else
(- base-w
(remainder
(days-ymd2ymd base-y base-m base-d y m d)
7)))))
;;;019
(define (prog019)
(let ((y1 1901)
(m1 1)
(d1 1)
(y2 2000)
(m2 12)
(d2 31))
(let loop ((y y1) (m m1) (count 0) (daylst '()))
(cond ((> y y2) (list count daylst))
((> m 12)
(loop (add1 y) 1 count daylst))
((= 0 (day-week y m 1))
(loop y
(add1 m)
(add1 count)
(cons (list y m 1) daylst)
))
(else
(loop y
(add1 m)
count
daylst))))))
(prog019)
'(171
((2000 10 1)
(1999 8 1)
(1998 11 1)
(1998 3 1)
(1998 2 1)
(1997 6 1)
(1996 12 1)
(1996 9 1)
(1995 10 1)
(1995 1 1)
(1994 5 1)
(1993 8 1)
(1992 11 1)
(1992 3 1)
(1991 12 1)
(1991 9 1)
(1990 7 1)
(1990 4 1)
(1989 10 1)
(1989 1 1)
(1988 5 1)
(1987 11 1)
(1987 3 1)
(1987 2 1)
(1986 6 1)
(1985 12 1)
(1985 9 1)
(1984 7 1)
(1984 4 1)
(1984 1 1)
(1983 5 1)
(1982 8 1)
(1981 11 1)
(1981 3 1)
(1981 2 1)
(1980 6 1)
(1979 7 1)
(1979 4 1)
(1978 10 1)
(1978 1 1)
(1977 5 1)
(1976 8 1)
(1976 2 1)
(1975 6 1)
(1974 12 1)
(1974 9 1)
(1973 7 1)
(1973 4 1)
(1972 10 1)
(1971 8 1)
(1970 11 1)
(1970 3 1)
(1970 2 1)
(1969 6 1)
(1968 12 1)
(1968 9 1)
(1967 10 1)
(1967 1 1)
(1966 5 1)
(1965 8 1)
(1964 11 1)
(1964 3 1)
(1963 12 1)
(1963 9 1)
(1962 7 1)
(1962 4 1)
(1961 10 1)
(1961 1 1)
(1960 5 1)
(1959 11 1)
(1959 3 1)
(1959 2 1)
(1958 6 1)
(1957 12 1)
(1957 9 1)
(1956 7 1)
(1956 4 1)
(1956 1 1)
(1955 5 1)
(1954 8 1)
(1953 11 1)
(1953 3 1)
(1953 2 1)
(1952 6 1)
(1951 7 1)
(1951 4 1)
(1950 10 1)
(1950 1 1)
(1949 5 1)
(1948 8 1)
(1948 2 1)
(1947 6 1)
(1946 12 1)
(1946 9 1)
(1945 7 1)
(1945 4 1)
(1944 10 1)
(1943 8 1)
(1942 11 1)
(1942 3 1)
(1942 2 1)
(1941 6 1)
(1940 12 1)
(1940 9 1)
(1939 10 1)
(1939 1 1)
(1938 5 1)
(1937 8 1)
(1936 11 1)
(1936 3 1)
(1935 12 1)
(1935 9 1)
(1934 7 1)
(1934 4 1)
(1933 10 1)
(1933 1 1)
(1932 5 1)
(1931 11 1)
(1931 3 1)
(1931 2 1)
(1930 6 1)
(1929 12 1)
(1929 9 1)
(1928 7 1)
(1928 4 1)
(1928 1 1)
(1927 5 1)
(1926 8 1)
(1925 11 1)
(1925 3 1)
(1925 2 1)
(1924 6 1)
(1923 7 1)
(1923 4 1)
(1922 10 1)
(1922 1 1)
(1921 5 1)
(1920 8 1)
(1920 2 1)
(1919 6 1)
(1918 12 1)
(1918 9 1)
(1917 7 1)
(1917 4 1)
(1916 10 1)
(1915 8 1)
(1914 11 1)
(1914 3 1)
(1914 2 1)
(1913 6 1)
(1912 12 1)
(1912 9 1)
(1911 10 1)
(1911 1 1)
(1910 5 1)
(1909 8 1)
(1908 11 1)
(1908 3 1)
(1907 12 1)
(1907 9 1)
(1906 7 1)
(1906 4 1)
(1905 10 1)
(1905 1 1)
(1904 5 1)
(1903 11 1)
(1903 3 1)
(1903 2 1)
(1902 6 1)
(1901 12 1)
(1901 9 1)))
2014年04月23日 04点04分 2
1