[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[shootout] moment.scm
;; Moments.scm
(require (lib "list.ss")) ; quiksort and mergesort
(define (main args)
(let* ((sum 0.0)
(numlist (let loop ((line (read-line)) (numlist '()))
(cond ((eof-object? line) numlist)
(else
(let ((num (string->number line)))
(set! sum (+ num sum))
(loop (read-line) (cons num numlist))))))))
(let ((n (length numlist)))
(let ((mean (/ sum n))
(average_deviation 0.0)
(standard_deviation 0.0)
(variance 0.0)
(skew 0.0)
(kurtosis 0.0)
(median 0.0)
(deviation 0.0))
(let loop ((nums numlist))
(if (not (null? nums))
(begin
(set! deviation (- (car nums) mean))
(set! average_deviation (+ average_deviation (abs deviation)))
(set! variance (+ variance (expt deviation 2.0)))
(set! skew (+ skew (expt deviation 3.0)))
(set! kurtosis (+ kurtosis (expt deviation 4)))
(loop (cdr nums)))))
(set! average_deviation (/ average_deviation (exact->inexact n)))
(set! variance (/ variance (- n 1)))
(set! standard_deviation (sqrt variance))
(cond ((> variance 0.0)
(set! skew (/ skew (* n variance standard_deviation)))
(set! kurtosis (- (/ kurtosis (* n variance variance))
3.0))))
(set! numlist (quicksort numlist (lambda (x y) (< x y))))
(let ((mid (quotient n 2)))
(if (zero? (modulo n 2))
(set! median (/ (+ (car (list-tail numlist mid))
(car (list-tail numlist (- mid 1))))
2.0))
(set! median (car (list-tail numlist mid)))))
(set! standard_deviation (/ (round (* standard_deviation 1000000))
1000000))
(for-each display
`("n: " ,n "\n"
"median: " ,median "\n"
"mean: " ,mean "\n"
"average_deviation: " ,average_deviation "\n"
"standard_deviation: " ,standard_deviation "\n"
"variance: " ,variance "\n"
"skew: " ,skew "\n"
"kurtosis: " ,kurtosis "\n" ))))))