fork download
  1. ; reverse vowels
  2.  
  3. (define (vowel? c) (member (char-downcase c) '(#\a #\e #\i #\o #\u)))
  4.  
  5. (define (reverse-vowels str)
  6. (let* ((cs (string->list str)) (vs (reverse (filter vowel? cs))))
  7. (let loop ((cs cs) (vs vs) (zs (list)))
  8. (cond ((null? cs) (list->string (reverse zs)))
  9. ((vowel? (car cs))
  10. (let ((f (if (char-upper-case? (car cs)) char-upcase char-downcase)))
  11. (loop (cdr cs) (cdr vs) (cons (f (car vs)) zs))))
  12. (else (loop (cdr cs) vs (cons (car cs) zs)))))))
  13.  
  14. (display (reverse-vowels "HELLO world")) (newline)
  15. (display (reverse-vowels "Programming PRAXIS")) (newline)
  16.  
  17. (define (reverse-vowels str)
  18. (define (fix-case x y)
  19. (if (char-upper-case? x)
  20. (char-upcase y)
  21. (char-downcase y)))
  22. (let loop ((lo 0) (hi (- (string-length str) 1)))
  23. (cond ((< hi lo) str)
  24. ((and (vowel? (string-ref str lo))
  25. (vowel? (string-ref str hi)))
  26. (let ((temp (string-ref str lo)))
  27. (string-set! str lo
  28. (fix-case temp (string-ref str hi)))
  29. (string-set! str hi
  30. (fix-case (string-ref str hi) temp)))
  31. (loop (+ lo 1) (- hi 1)))
  32. ((not (vowel? (string-ref str lo))) (loop (+ lo 1) hi))
  33. ((not (vowel? (string-ref str hi))) (loop lo (- hi 1)))
  34. (else (loop (+ lo 1) (- hi 1))))))
  35.  
  36. (display (reverse-vowels "HELLO world")) (newline)
  37. (display (reverse-vowels "Programming PRAXIS")) (newline)
Success #stdin #stdout 0.02s 50288KB
stdin
Standard input is empty
stdout
HOLLO werld
Prigramming PRAXOS
HOLLO werld
Prigramming PRAXOS