Project Euler 12 in Scheme
;; helpers
(define (reduce func lst)
(let loop ((val (car lst))
(lst (cdr lst)))
(if (null? lst) val
(loop (func val (car lst)) (cdr lst)))))
;; e12
(define (factors n)
(define (*factors d)
(cond ((>= d n) (list))
((= (modulo n d) 0) (cons d (*factors (+ d 1))))
(else (*factors (+ d 1)))))
(*factors 1))
(define (e12 n)
(define (e12-inner x)
(let ((i (length (factors (+ (reduce + (iota x)) x)))))
(if (> i n)
(+ (reduce + (iota x)) x)
(e12-inner (+ x 1)))))
(e12-inner 1))