; string rotations
(define (take n xs)
(let loop ((n n) (xs xs) (ys '()))
(if (or (zero? n) (null? xs))
(reverse ys)
(loop (- n 1) (cdr xs)
(cons (car xs) ys)))))
(define (rots xs)
(let ((len (length xs)))
(do ((xxs (append xs xs) (cdr xxs))
(rots (list) (cons (take len xxs) rots))
(n len (- n 1))) ((zero? n) rots))))
(define (string-rotations str)
(map list->string (rots (string->list str))))
(display (string-rotations "Praxis")) (newline)
OyBzdHJpbmcgcm90YXRpb25zCgooZGVmaW5lICh0YWtlIG4geHMpCiAgKGxldCBsb29wICgobiBuKSAoeHMgeHMpICh5cyAnKCkpKQogICAgKGlmIChvciAoemVybz8gbikgKG51bGw/IHhzKSkKICAgICAgICAocmV2ZXJzZSB5cykKICAgICAgICAobG9vcCAoLSBuIDEpIChjZHIgeHMpCiAgICAgICAgICAgICAgKGNvbnMgKGNhciB4cykgeXMpKSkpKQoKKGRlZmluZSAocm90cyB4cykKICAobGV0ICgobGVuIChsZW5ndGggeHMpKSkKICAgIChkbyAoKHh4cyAoYXBwZW5kIHhzIHhzKSAoY2RyIHh4cykpCiAgICAgICAgIChyb3RzIChsaXN0KSAoY29ucyAodGFrZSBsZW4geHhzKSByb3RzKSkKICAgICAgICAgKG4gbGVuICgtIG4gMSkpKSAoKHplcm8/IG4pIHJvdHMpKSkpCgooZGVmaW5lIChzdHJpbmctcm90YXRpb25zIHN0cikKICAobWFwIGxpc3QtPnN0cmluZyAocm90cyAoc3RyaW5nLT5saXN0IHN0cikpKSkKCihkaXNwbGF5IChzdHJpbmctcm90YXRpb25zICJQcmF4aXMiKSkgKG5ld2xpbmUpCg==