#!/usr/local/bin/guile \
-e main -s
!#
;;; $Id: moments.guile,v 1.2 2001/06/29 23:12:37 doug Exp $
;;; http://www.bagley.org/~doug/shootout/
;;; from Brad Knotwell
(use-modules (ice-9 format))
(define sum 0)
(define nums '())
(define (compute-all mean n continuation)
(let ((average-deviation 0) (standard-deviation 0) (variance 0) (skew 0)
(kurtosis 0) (mid 0) (median 0) (deviation 0) (tmp-lst nums))
(do ((num (car tmp-lst) (if (eq? tmp-lst '()) '() (car tmp-lst))))
((eq? num '()) (begin (set! variance (/ variance (1- n)))
(set! standard-deviation (sqrt variance))
(if (> variance 0.0)
(begin (set! skew (/ skew (* n variance standard-deviation)))
(set! kurtosis (- (/ kurtosis (* n variance variance)) 3))))
(set! nums (sort-list nums >))
(set! mid (/ n 2))
(set! median (if (= (remainder n 2) 0)
(/ (+ (list-ref nums mid)
(list-ref nums (1- mid)))
2)
(list-ref nums mid)))
(continuation n median mean
(/ average-deviation n)
standard-deviation variance
skew kurtosis)))
(let ((deviation (- num mean)))
(begin (set! tmp-lst (cdr tmp-lst))
(set! average-deviation (+ average-deviation (abs deviation)))
(set! variance (+ variance (expt deviation 2)))
(set! skew (+ skew (expt deviation 3)))
(set! kurtosis (+ kurtosis (expt deviation 4))))))))
(define output-format
"n: ~D
median: ~,6F
mean: ~,6F
average_deviation: ~,6F
standard_deviation: ~,6F
variance: ~,6F
skew: ~,6F
kurtosis: ~,6F
")
(define (main args)
(do ((line (read-line) (read-line)))
((eof-object? line)
(compute-all (/ sum (length nums)) (length nums)
(lambda (x . y) (display (apply format (cons output-format (cons x y)))))))
(let ((num (string->number line)))
(begin (set! nums (cons num nums)) (set! sum (+ sum num))))))