; happy numbers
(define (sum xs) (apply + xs))
(define (square x) (* x x))
(define (digits n . args)
(let ((b (if (null? args) 10 (car args))))
(let loop ((n n) (d '()))
(if (zero? n) d
(loop (quotient n b)
(cons (modulo n b) d))))))
(define (happy? n)
(let loop ((n n) (ns '()))
(cond ((= n 1) #t)
((member n ns) #f)
(else (loop (sum (map square (digits n)))
(cons n ns))))))
; display first eight happy numbers
(display "happy numbers:")
(let loop ((n 8) (i 1))
(cond ((zero? n) (newline))
((happy? i)
(display " ")
(display i)
(loop (- n 1) (+ i 1)))
(else (loop n (+ i 1)))))