fork(1) download
  1. ; string re-ordering
  2.  
  3. (define (make-list n x)
  4. (let loop ((n n) (xs '()))
  5. (if (zero? n) xs
  6. (loop (- n 1) (cons x xs)))))
  7.  
  8. (define (string-index c str)
  9. (let loop ((ss (string->list str)) (k 0))
  10. (cond ((null? ss) #f)
  11. ((char=? (car ss) c) k)
  12. (else (loop (cdr ss) (+ k 1))))))
  13.  
  14. (define sort #f)
  15. (define merge #f)
  16. (let ()
  17. (define dosort
  18. (lambda (pred? ls n)
  19. (if (= n 1)
  20. (list (car ls))
  21. (let ((i (quotient n 2)))
  22. (domerge pred?
  23. (dosort pred? ls i)
  24. (dosort pred? (list-tail ls i) (- n i)))))))
  25. (define domerge
  26. (lambda (pred? l1 l2)
  27. (cond
  28. ((null? l1) l2)
  29. ((null? l2) l1)
  30. ((pred? (car l2) (car l1))
  31. (cons (car l2) (domerge pred? l1 (cdr l2))))
  32. (else (cons (car l1) (domerge pred? (cdr l1) l2))))))
  33. (set! sort
  34. (lambda (pred? l)
  35. (if (null? l) l (dosort pred? l (length l)))))
  36. (set! merge
  37. (lambda (pred? l1 l2)
  38. (domerge pred? l1 l2))))
  39.  
  40. (define (index c str)
  41. (let ((x (string-index c str)))
  42. (if x x -1)))
  43.  
  44. (define (order1 t o)
  45. (let loop ((ts (string->list t)) (ps (list)))
  46. (if (pair? ts)
  47. (loop (cdr ts) (cons (cons (index (car ts) o) (car ts)) ps))
  48. (list->string
  49. (map cdr (sort (lambda (a b) (< (car a) (car b))) ps))))))
  50.  
  51. (display (order1 "hello" "eloh")) (newline)
  52. (display (order1 "help" "eloh")) (newline)
  53.  
  54. (define (build o buckets out)
  55. (list->string (apply append (reverse out)
  56. (map (lambda (c)
  57. (make-list (vector-ref buckets (char->integer c)) c))
  58. (string->list o)))))
  59.  
  60. (define (order2 t o)
  61. (define c->i char->integer)
  62. (let ((buckets (make-vector 256 #f)))
  63. (do ((os (string->list o) (cdr os))) ((null? os))
  64. (vector-set! buckets (c->i (car os)) 0))
  65. (let loop ((ts (string->list t)) (out (list)))
  66. (cond ((null? ts) (build o buckets out))
  67. ((vector-ref buckets (c->i (car ts)))
  68. (vector-set! buckets (c->i (car ts))
  69. (+ (vector-ref buckets (c->i (car ts))) 1))
  70. (loop (cdr ts) out))
  71. (else (loop (cdr ts) (cons (car ts) out)))))))
  72.  
  73. (display (order2 "hello" "eloh")) (newline)
  74. (display (order2 "help" "eloh")) (newline)
Success #stdin #stdout 0.01s 7272KB
stdin
Standard input is empty
stdout
elloh
pelh
elloh
pelh