fork download
  1. ; string rotation
  2.  
  3. (define (string-find pat str . s)
  4. (let* ((plen (string-length pat))
  5. (slen (string-length str))
  6. (skip (make-vector plen 0)))
  7. (let loop ((i 1) (j 0))
  8. (cond ((= i plen))
  9. ((char=? (string-ref pat i) (string-ref pat j))
  10. (vector-set! skip i (+ j 1))
  11. (loop (+ i 1) (+ j 1)))
  12. ((< 0 j) (loop i (vector-ref skip (- j 1))))
  13. (else (vector-set! skip i 0)
  14. (loop (+ i 1) j))))
  15. (let loop ((p 0) (s (if (null? s) 0 (car s))))
  16. (cond ((= s slen) #f)
  17. ((char=? (string-ref pat p) (string-ref str s))
  18. (if (= p (- plen 1))
  19. (- s plen -1)
  20. (loop (+ p 1) (+ s 1))))
  21. ((< 0 p) (loop (vector-ref skip (- p 1)) s))
  22. (else (loop p (+ s 1)))))))
  23.  
  24. (define (string-rotated? s1 s2)
  25. (and (= (string-length s1) (string-length s2))
  26. (string-find s2 (string-append s1 s1))))
  27.  
  28. (string-rotated? "programmingpraxis" "programmingpraxis")
  29. (string-rotated? "programmingpraxis" "praxisprogramming")
  30. (string-rotated? "programmingpraxis" "programmingprasix")
Success #stdin #stdout 0.02s 4176KB
stdin
Standard input is empty
stdout
Standard output is empty