problem12
もっと速くできそうな気がするけど
(define (triangle-number k) (/ (* k (+ k 1)) 2)) (define (enough-have? x kinds) (let ((sx (floor (sqrt x))) (half (/ kinds 2))) (let iter ((n 1) (c 0)) (cond ((or (= n sx) (= c half)) (= c half)) ((zero? (modulo x n)) (iter (+ n 1) (+ c 1))) (else (iter (+ n 1) c)))))) (define (solve kinds) (let iter ((x 1)) (let1 tri (triangle-number x) (if (enough-have? tri kinds) tri (iter (+ x 1)))))) (solve 6); => 28 (solve 500)