; keypad errors

(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 (remove x xs)
  (let loop ((xs xs) (zs '()))
    (cond ((null? xs) (reverse zs))
          ((equal? (car xs) x) (loop (cdr xs) zs))
          (else (loop (cdr xs) (cons (car xs) zs))))))

(define (range . args)
  (case (length args)
    ((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
    ((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
    ((3) (let ((le? (if (negative? (caddr args)) >= <=)))
           (let loop ((x(car args)) (xs '()))
             (if (le? (cadr args) x)
                 (reverse xs)
                 (loop (+ x (caddr args)) (cons x xs))))))
    (else (error 'range "unrecognized arguments"))))

(define (match target keyed)
  (let ((ts (digits target)) (ks (digits keyed)))
    (if (equal? ts ks) #t
      (let loop ((ds (range 10)))
        (if (null? ds) #f
          (if (equal? (remove (car ds) ts) ks) #t
            (loop (cdr ds))))))))

(display (match 18684 164)) (newline)
(display (match 17674 164)) (newline)
(display (match 18684 165)) (newline)
(display (match 18684 18685)) (newline); your code goes here