;;; no.188 HAPPY DAY ;;; ;;; カレンダーライブラリを使うでもいいけど、 ;;; すべての日付を作り出してチェックするのがシンプルか。 ;;; ;;; ありえないケースなどを予め省いてチェックの繰り返しを ;;; 減らしたりするのは実践的だけど、ここではやらない。 (define num-happy-days (lambda () (let* ((end-day-list '(31 28 31 30 31 30 31 31 30 31 30 31)) ; 各月の終わりの日 (day-list-list (map (lambda (end) ; 日のデータの生成 (let loop1 ((days '()) (d 1)) (cond ((< end d) (reverse days) ) (else (loop1 (cons d days) (+ d 1)) )))) end-day-list)) (dates-list-list (let loop2 ((dates-lists '()) ; 日付データの生成 (month 1) (day-lists day-list-list) ) (cond ((null? day-lists) (reverse dates-lists) ) (else (loop2 (cons (map (lambda (day) (list month day)) (car day-lists)) dates-lists) (+ 1 month) (cdr day-lists)) ) ))) ) ;;(map print dates-list-list)))) (let ((happy-day? (lambda (date-pair) (let ((digits (map digit->integer (string->list (number->string (cadr date-pair))))) ) (if (= (car date-pair) (apply + digits)) #t #f)))) ) (apply + (map (lambda (dates-list) (length (filter happy-day? dates-list)) ) dates-list-list)))))) (print (num-happy-days)) (flush)