Problem 19 » 履歴 » バージョン 3
Noppi, 2024/01/01 16:22
| 1 | 1 | Noppi | [ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]] |
|---|---|---|---|
| 2 | # [[Problem 19]] |
||
| 3 | |||
| 4 | ## Counting Sundays |
||
| 5 | You are given the following information, but you may prefer to do some research for yourself. |
||
| 6 | |||
| 7 | * 1 Jan 1900 was a Monday. |
||
| 8 | * Thirty days has September, April, June and November. |
||
| 9 | All the rest have thirty-one, |
||
| 10 | Saving February alone, |
||
| 11 | Which has twenty-eight, rain or shine. |
||
| 12 | And on leap years, twenty-nine. |
||
| 13 | * A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400. |
||
| 14 | |||
| 15 | How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)? |
||
| 16 | |||
| 17 | ## 日曜日の数え上げ |
||
| 18 | 次の情報が与えられている. |
||
| 19 | |||
| 20 | * 1900年1月1日は月曜日である. |
||
| 21 | * 9月, 4月, 6月, 11月は30日まであり, 2月を除く他の月は31日まである. |
||
| 22 | * 2月は28日まであるが, うるう年のときは29日である. |
||
| 23 | * うるう年は西暦が4で割り切れる年に起こる. しかし, 西暦が400で割り切れず100で割り切れる年はうるう年でない. |
||
| 24 | |||
| 25 | 20世紀(1901年1月1日から2000年12月31日)中に月の初めが日曜日になるのは何回あるか? |
||
| 26 | |||
| 27 | ```scheme |
||
| 28 | 2 | Noppi | #!r6rs |
| 29 | #!chezscheme |
||
| 30 | |||
| 31 | (import (chezscheme)) |
||
| 32 | |||
| 33 | (define (leap-year? year) |
||
| 34 | (cond |
||
| 35 | [(and (not (zero? (mod year 400))) |
||
| 36 | (zero? (mod year 100))) |
||
| 37 | #f] |
||
| 38 | [(zero? (mod year 4)) #t] |
||
| 39 | [else #f])) |
||
| 40 | |||
| 41 | (define (days-count year month) |
||
| 42 | (case month |
||
| 43 | [(4 6 9 11) 30] |
||
| 44 | [2 |
||
| 45 | (if (leap-year? year) |
||
| 46 | 29 |
||
| 47 | 28)] |
||
| 48 | [else 31])) |
||
| 49 | |||
| 50 | (define (month-calender year month start-dayweek) |
||
| 51 | (let ([end (days-count year month)]) |
||
| 52 | 3 | Noppi | (let loop ([day 1] [dayweek (mod start-dayweek 7)] [result '()]) |
| 53 | (if (< end day) |
||
| 54 | (values (reverse result) dayweek) |
||
| 55 | (loop (add1 day) (mod (add1 dayweek) 7) |
||
| 56 | (cons `((,year ,month ,day) . ,dayweek) result)))))) |
||
| 57 | 2 | Noppi | |
| 58 | (define (year-calender year start-dayweek) |
||
| 59 | 3 | Noppi | (let loop ([month 1] [dayweek (mod start-dayweek 7)] [result '()]) |
| 60 | (if (< 12 month) |
||
| 61 | 2 | Noppi | (values result dayweek) |
| 62 | 3 | Noppi | (let-values ([(lis next-dayweek) (month-calender year month dayweek)]) |
| 63 | (loop (add1 month) next-dayweek `(,@result ,@lis)))))) |
||
| 64 | 2 | Noppi | |
| 65 | (define (pickup-dayweek calender dayweek) |
||
| 66 | (filter |
||
| 67 | (lambda (cell) |
||
| 68 | (= (cdr cell) dayweek)) |
||
| 69 | calender)) |
||
| 70 | |||
| 71 | (define (pickup-start-month calender) |
||
| 72 | (filter |
||
| 73 | (lambda (cell) |
||
| 74 | (= (list-ref (car cell) 2) 1)) |
||
| 75 | calender)) |
||
| 76 | |||
| 77 | (define calender-1900-2000 |
||
| 78 | (let loop ([year 1900] [dayweek 1] [result '()]) |
||
| 79 | (if (< 2000 year) |
||
| 80 | result |
||
| 81 | (let-values ([(lis next-dayweek) (year-calender year dayweek)]) |
||
| 82 | (loop (add1 year) next-dayweek `(,@result ,@lis)))))) |
||
| 83 | |||
| 84 | (define calender-1901-2000 |
||
| 85 | (filter |
||
| 86 | (lambda (cell) |
||
| 87 | (<= 1901 (caar cell))) |
||
| 88 | calender-1900-2000)) |
||
| 89 | |||
| 90 | (define answer-19 |
||
| 91 | (length |
||
| 92 | (pickup-dayweek |
||
| 93 | (pickup-start-month calender-1901-2000) |
||
| 94 | 0))) |
||
| 95 | |||
| 96 | (printf "19: ~D~%" answer-19) |
||
| 97 | 1 | Noppi | ``` |