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)