; lychrel numbers

(define (r n)
  (let loop ((n n) (z 0))
    (if (zero? n) z
      (loop (quotient n 10)
            (+ (* z 10) (modulo n 10))))))

(define (s n) (+ n (r n)))

(define (p? n) (= n (r n)))

(define (lychrel n . b)
  (let ((b (if (null? b) 100 (car b))))
    (let loop ((b b) (z n) (xs (list n)))
      (if (zero? b) (list n #f)
        (let ((x (s z)))
          (if (p? x) (reverse (cons x xs))
            (loop (- b 1) x (cons x xs))))))))

(display (lychrel 281)) (newline)
(display (lychrel 196)) (newline)

(do ((n 1 (+ n 1))) ((< 1000 n))
  (when (not (cadr (lychrel n)))
    (display n) (newline)))