; pandigital numbers
(define (pandigital? . xs)
(let ((ds (make-vector 10 #f)))
(let x-loop ((xs xs))
(if (null? xs)
(let loop ((i 0))
(if (= i 10) #t
(if (not (vector-ref ds i)) #f
(loop (+ i 1)))))
(let d-loop ((x (car xs)))
(if (zero? x) (x-loop (cdr xs))
(let ((q (quotient x 10))
(r (remainder x 10)))
(if (vector-ref ds r) #f
(begin (vector-set! ds r #t)
(d-loop q))))))))))
(display
(let a-loop ((a 100))
(if (= a 1000) #f
(let b-loop ((b (+ a 1)))
(if (= b 1000) (a-loop (+ a 1))
(if (pandigital? a b (+ a b)) a
(b-loop (+ b 1))))))))
(newline)
(display
(let a-loop ((a 100) (ps (list)))
(if (= a 1000) (reverse ps)
(let b-loop ((b (+ a 1)) (ps ps))
(if (= b 1000) (a-loop (+ a 1) ps)
(b-loop (+ b 1)
(if (pandigital? a b (+ a b))
(cons (list a b (+ a b)) ps)
ps)))))))
(newline)