; muenchhausen numbers

(define (sum xs) (apply + xs))

(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 (f n)
  (define (power n)
    (vector-ref '#(0 1 4 27 256 3125 46656
                  823543 16777216 387420489) n))
  (sum (map power (digits n))))

(do ((n 0 (+ n 1))) ((= n 4000))
  (when (= (f n) n)
    (display n) (newline)))