fork download
  1. ; sort four
  2.  
  3. (define (permutations xs)
  4. (define (rev xs n ys)
  5. (if (zero? n) ys
  6. (rev (cdr xs) (- n 1) (cons (car xs) ys))))
  7. (let ((xs xs) (perms (list xs)))
  8. (define (perm n)
  9. (if (> n 1)
  10. (do ((j (- n 1) (- j 1)))
  11. ((zero? j) (perm (- n 1)))
  12. (perm (- n 1))
  13. (set! xs (rev xs n (list-tail xs n)))
  14. (set! perms (cons xs perms)))))
  15. (perm (length xs))
  16. perms))
  17.  
  18. (define (sort4 a b c d)
  19. (let ((ab (if (< a b) (list a b) (list b a)))
  20. (cd (if (< c d) (list c d) (list d c))))
  21. (let ((first #f) (mid1 #f) (mid2 #f) (last #f))
  22. (cond ((< (car ab) (car cd))
  23. (set! first (car ab))
  24. (set! mid1 (car cd)))
  25. (else
  26. (set! first (car cd))
  27. (set! mid1 (car ab))))
  28. (cond ((< (cadr ab) (cadr cd))
  29. (set! last (cadr cd))
  30. (set! mid2 (cadr ab)))
  31. (else
  32. (set! last (cadr ab))
  33. (set! mid2 (cadr cd))))
  34. (if (< mid1 mid2)
  35. (list first mid1 mid2 last)
  36. (list first mid2 mid1 last)))))
  37.  
  38. (for-each
  39. (lambda (xs)
  40. (display xs) (display " => ")
  41. (display (apply sort4 xs)) (newline))
  42. (permutations '(1 2 3 4)))
Success #stdin #stdout 0.02s 42848KB
stdin
Standard input is empty
stdout
(4 3 2 1) => (1 2 3 4)
(3 4 2 1) => (1 2 3 4)
(2 4 3 1) => (1 2 3 4)
(4 2 3 1) => (1 2 3 4)
(3 2 4 1) => (1 2 3 4)
(2 3 4 1) => (1 2 3 4)
(1 4 3 2) => (1 2 3 4)
(4 1 3 2) => (1 2 3 4)
(3 1 4 2) => (1 2 3 4)
(1 3 4 2) => (1 2 3 4)
(4 3 1 2) => (1 2 3 4)
(3 4 1 2) => (1 2 3 4)
(2 1 4 3) => (1 2 3 4)
(1 2 4 3) => (1 2 3 4)
(4 2 1 3) => (1 2 3 4)
(2 4 1 3) => (1 2 3 4)
(1 4 2 3) => (1 2 3 4)
(4 1 2 3) => (1 2 3 4)
(3 2 1 4) => (1 2 3 4)
(2 3 1 4) => (1 2 3 4)
(1 3 2 4) => (1 2 3 4)
(3 1 2 4) => (1 2 3 4)
(2 1 3 4) => (1 2 3 4)
(1 2 3 4) => (1 2 3 4)