Problem 44 - 五角数

五角数に関する問題。


Problem 44 - PukiWiki

2つの五角数の和と差を取って、五角数になるものを見つける。


五角数チェックは前に書いたのでコピッペで。

2つの和と差は五角数キャッシュを持っておいて、キャッシュと比較してく事にする。

(define (problem44)
  (letrec ((pentagonal? (lambda (n)
                       (integer? (/ (+ (sqrt (+ 1 (* 24 n))) 1) 6))))
           (iter
             (lambda (n acc)
               (let* ((p (/ (* n (- (* 3 n) 1)) 2))
                      (res (find (lambda (a)
                                   (and (pentagonal? (+ p a))
                                        (pentagonal? (- p a)))) acc)))
                 (if res
                     (- p res)
                     (iter (+ n 1) (cons p acc)))))))
    (iter 2 '(1))))

(problem44) ; 5482660

とりあえず紙に展開してみると解き方がわかってくるな。