; 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