; two swaps
(define (two-swaps a b c)
(define-syntax swap!
(syntax-rules ()
((swap! x y)
(let ((z x))
(set! x y)
(set! y z)))))
(if (< a b)
(if (< a c)
(swap! a a)
(swap! a c))
(if (< b c)
(swap! a b)
(swap! a c)))
(if (< b c)
(swap! b b)
(swap! b c))
(list a b c))
(display (two-swaps 1 2 3)) (newline)
(display (two-swaps 1 3 2)) (newline)
(display (two-swaps 2 1 3)) (newline)
(display (two-swaps 2 3 1)) (newline)
(display (two-swaps 3 1 2)) (newline)
(display (two-swaps 3 2 1)) (newline)
OyB0d28gc3dhcHMKCihkZWZpbmUgKHR3by1zd2FwcyBhIGIgYykKICAoZGVmaW5lLXN5bnRheCBzd2FwIQogICAgKHN5bnRheC1ydWxlcyAoKQogICAgICAoKHN3YXAhIHggeSkKICAgICAgICAobGV0ICgoeiB4KSkKICAgICAgICAgIChzZXQhIHggeSkKICAgICAgICAgIChzZXQhIHkgeikpKSkpCiAgKGlmICg8IGEgYikKICAgICAgKGlmICg8IGEgYykKICAgICAgICAgIChzd2FwISBhIGEpCiAgICAgICAgICAoc3dhcCEgYSBjKSkKICAgICAgKGlmICg8IGIgYykKICAgICAgICAgIChzd2FwISBhIGIpCiAgICAgICAgICAoc3dhcCEgYSBjKSkpCiAgKGlmICg8IGIgYykKICAgICAgKHN3YXAhIGIgYikKICAgICAgKHN3YXAhIGIgYykpCiAgKGxpc3QgYSBiIGMpKQoKKGRpc3BsYXkgKHR3by1zd2FwcyAxIDIgMykpIChuZXdsaW5lKQooZGlzcGxheSAodHdvLXN3YXBzIDEgMyAyKSkgKG5ld2xpbmUpCihkaXNwbGF5ICh0d28tc3dhcHMgMiAxIDMpKSAobmV3bGluZSkKKGRpc3BsYXkgKHR3by1zd2FwcyAyIDMgMSkpIChuZXdsaW5lKQooZGlzcGxheSAodHdvLXN3YXBzIDMgMSAyKSkgKG5ld2xpbmUpCihkaXNwbGF5ICh0d28tc3dhcHMgMyAyIDEpKSAobmV3bGluZSk=