% $Id: moments.slang,v 1.0 2003/01/03 13:38:00 dada Exp $
% http://dada.perl.it/shootout/
%
% contributed by John E. Davis
define main ()
{
variable nums = array_map (Double_Type, &atof, fgetslines (stdin));
variable n = length (nums);
variable sum = 0;
foreach (nums) sum += ();
variable mean = sum/n;
variable average_deviation = 0;
variable standard_deviation = 0;
variable variance = 0;
variable skew = 0;
variable kurtosis = 0;
% No slang programmer would code explicit loops.
foreach (nums)
{
variable num = ();
variable deviation = num - mean;
average_deviation += abs(deviation);
variance += deviation^2;
skew += deviation^3;
kurtosis += deviation^4;
}
average_deviation /= n;
variance /= (n - 1);
standard_deviation = sqrt(variance);
if (variance > 0.0)
{
skew /= (n * variance * standard_deviation);
kurtosis = kurtosis/(n * variance * variance) - 3.0;
}
nums = nums[array_sort(nums)];
variable mid = n/2;
variable median;
if (n mod 2)
median = nums[mid];
else
median = (nums[mid] + nums[mid-1])/2;
vmessage ("n: %d", n);
vmessage ("median: %f", median);
vmessage ("mean: %f", mean);
vmessage ("average_deviation: %f", average_deviation);
vmessage ("standard_deviation: %f", standard_deviation);
vmessage ("variance: %f", variance);
vmessage ("skew: %f", skew);
vmessage ("kurtosis: %f", kurtosis);
}
main ();