Project Euler 17 in Scheme

@timgallant

;; e17

(define (ones x)
  (cond ((= x 0) 0)
        ((= x 1) 3)
        ((= x 2) 3)
        ((= x 3) 5)
        ((= x 4) 4)
        ((= x 5) 4)
        ((= x 6) 3)
        ((= x 7) 5)
        ((= x 8) 5)
        ((= x 9) 4)
        ((= x 10) 3)
        ((= x 11) 6)
        ((= x 12) 6)
        ((= x 13) 8)
        ((= x 14) 8)
        ((= x 15) 7)
        ((= x 16) 7)
        ((= x 17) 9)
        ((= x 18) 8)
        ((= x 19) 8)))

(define (tens x)
  (cond ((= x 0) 0)
        ((= x 2) 6)
        ((= x 3) 6)
        ((= x 4) 5)
        ((= x 5) 5)
        ((= x 6) 5)
        ((= x 7) 7)
        ((= x 8) 6)
        ((= x 9) 6)))

(define (tens-sum x)
  (if (< x 20)
      (ones x)
      (let ((lst (num->list x)))
        (if (= (list->num (cdr lst)) 0)
            (tens (car lst))
            (+ (tens (car lst)) (ones (car (cdr lst))))))))

(define (hundreds-sum x)
  (if (< x 100)
      (tens-sum x)
      (let* ((lst (num->list x))
             (lst2 (list->num (cdr lst))))
        (if (= lst2 0)
            (+ (ones (car lst)) 7)
            (+ (+ (ones (car lst)) 10) (tens-sum (list->num (cdr lst))))))))

(define (e17 x)
  (if (< x 1)
      '()
      (cons (hundreds-sum x) (e17 (- x 1)))))