fork download
  1. ; a fun little task
  2.  
  3. (define (insert lt? x xs)
  4. (let loop ((xs xs) (zs (list)))
  5. (cond ((null? xs) (reverse (cons x zs)))
  6. ((lt? x (car xs))
  7. (append (reverse zs) (list x) xs))
  8. (else (loop (cdr xs) (cons (car xs) zs))))))
  9.  
  10. (define (remove x xs)
  11. (let loop ((xs xs) (zs (list)))
  12. (cond ((null? xs) (reverse zs))
  13. ((equal? x (car xs))
  14. (append (reverse zs) (cdr xs)))
  15. (else (loop (cdr xs) (cons (car xs) zs))))))
  16.  
  17. (define (f a b)
  18. (let* ((a-len (string-length a))
  19. (b-len (string-length b))
  20. (target (sort (string->list a) char<?))
  21. (window (sort (string->list
  22. (substring b 0 a-len)) char<?)))
  23. (let loop ((i 0) (j a-len) (window window))
  24. (cond ((= j b-len) #f)
  25. ((equal? target window) i)
  26. (else (loop (+ i 1) (+ j 1)
  27. (insert char<? (string-ref b j)
  28. (remove (string-ref b i) window))))))))
  29.  
  30. (display (f "xyz" "asdfgzyxpoiuy")) (newline) ; 5
  31. (display (f "wxyz" "asdfgzywpoiuy")) (newline) ; #f
Success #stdin #stdout 0.01s 42848KB
stdin
Standard input is empty
stdout
5
#f