; inversions
(define (inversion lt? base proc xs)
(do ((xs xs (cdr xs))) ((null? (cdr xs)) base)
(do ((ys (cdr xs) (cdr ys))) ((null? ys))
(when (lt? (car ys) (car xs))
(set! base (proc (car xs) (car ys) base))))))
(define (inversion-count xs)
(inversion < 0 (lambda (x y base) (+ base 1)) xs))
(define (inversion-enumerate xs)
(inversion < (list) (lambda (x y base) (cons (list x y) base)) xs))
(define xs '(1 4 3 2 5))
(display (inversion-count xs)) (newline)
(display (inversion-enumerate xs)) (newline)
OyBpbnZlcnNpb25zCgooZGVmaW5lIChpbnZlcnNpb24gbHQ/IGJhc2UgcHJvYyB4cykKICAoZG8gKCh4cyB4cyAoY2RyIHhzKSkpICgobnVsbD8gKGNkciB4cykpIGJhc2UpCiAgICAoZG8gKCh5cyAoY2RyIHhzKSAoY2RyIHlzKSkpICgobnVsbD8geXMpKQogICAgICAod2hlbiAobHQ/IChjYXIgeXMpIChjYXIgeHMpKQogICAgICAgIChzZXQhIGJhc2UgKHByb2MgKGNhciB4cykgKGNhciB5cykgYmFzZSkpKSkpKQoKKGRlZmluZSAoaW52ZXJzaW9uLWNvdW50IHhzKQogIChpbnZlcnNpb24gPCAwIChsYW1iZGEgKHggeSBiYXNlKSAoKyBiYXNlIDEpKSB4cykpCgooZGVmaW5lIChpbnZlcnNpb24tZW51bWVyYXRlIHhzKQogIChpbnZlcnNpb24gPCAobGlzdCkgKGxhbWJkYSAoeCB5IGJhc2UpIChjb25zIChsaXN0IHggeSkgYmFzZSkpIHhzKSkKCihkZWZpbmUgeHMgJygxIDQgMyAyIDUpKQooZGlzcGxheSAoaW52ZXJzaW9uLWNvdW50IHhzKSkgKG5ld2xpbmUpCihkaXNwbGF5IChpbnZlcnNpb24tZW51bWVyYXRlIHhzKSkgKG5ld2xpbmUp