; a fun little task

(define (insert lt? x xs)
  (let loop ((xs xs) (zs (list)))
    (cond ((null? xs) (reverse (cons x zs)))
          ((lt? x (car xs))
            (append (reverse zs) (list x) xs))
          (else (loop (cdr xs) (cons (car xs) zs))))))

(define (remove x xs)
  (let loop ((xs xs) (zs (list)))
    (cond ((null? xs) (reverse zs))
          ((equal? x (car xs))
            (append (reverse zs) (cdr xs)))
          (else (loop (cdr xs) (cons (car xs) zs))))))

(define (f a b)
  (let* ((a-len (string-length a))
         (b-len (string-length b))
         (target (sort (string->list a) char<?))
         (window (sort (string->list
                   (substring b 0 a-len)) char<?)))
    (let loop ((i 0) (j a-len) (window window))
      (cond ((= j b-len) #f)
            ((equal? target window) i)
            (else (loop (+ i 1) (+ j 1)
              (insert char<? (string-ref b j)
                (remove (string-ref b i) window))))))))

(display (f "xyz" "asdfgzyxpoiuy")) (newline) ; 5
(display (f "wxyz" "asdfgzywpoiuy")) (newline) ; #f