;(import (chicken sort))
(define (chunk xs)
(define (aux acc xs)
(cond
((null? xs) (reverse acc))
((or (null? acc) (not (= (caar acc) (car xs)))) (aux (cons (list (car xs)) acc) (cdr xs)))
(else (aux (cons (cons (car xs) (car acc)) (cdr acc)) (cdr xs)))))
(aux '() xs))
(define (factorial n)
(define (aux acc n)
(if (= n 0)
acc
(aux (* acc n) (- n 1))))
(aux 1 n))
(define (n-permutations xs)
(/ (factorial (length xs)) (foldl (lambda (acc ys) (* acc (factorial (length ys)))) 1 (chunk (sort xs <)))))
(define (count f xs)
(foldl (lambda (acc x) (+ acc (if (f x) 1 0))) 0 xs))
(define (f xs)
(define (aux acc xs)
(if (null? xs)
acc
(aux (+ acc (/ (* (count (lambda (x) (< x (car xs))) xs) (n-permutations xs)) (length xs))) (cdr xs))))
(aux 1 xs))
(print (f '(1 2 3 4 5 6 7 8 9)))
(print (f '(1 2 3 4 5 6 7 9 8)))
(print (f '(1 2 3 4 5 6 8 7 9)))
(print (f '(4 1 6 5 8 9 7 3 2)))
(print (f '(6 8 4 7 5 3 2 1 9)))
(print (f '(9 8 7 6 5 4 3 2 1)))
(print (f '(1 1 1 2 2 2 3 3 3 4 4 4)))
(print (f '(1 1 1 2 2 2 3 3 4 3 4 4)))
(print (f '(1 1 1 2 2 2 3 3 4 4 3 4)))
(print (f '(2 2 2 3 3 1 4 3 4 1 1 4)))
(print (f '(3 2 4 4 2 4 3 3 1 1 1 2)))
(print (f '(4 4 4 3 3 3 2 2 2 1 1 1)))
(print (f '(3 1 4 1 5 9)))