85 lines
3.2 KiB
Text
85 lines
3.2 KiB
Text
% Bin the given data, return an array of counts.
|
|
% CLU allows arrays to start at any index; the result array
|
|
% will have the same lower bound as the limit array.
|
|
|
|
% The datatype for the limits and data may be any type
|
|
% that allows the < comparator.
|
|
bin_count = proc [T: type] (limits, data: array[T]) returns (array[int])
|
|
where T has lt: proctype (T,T) returns (bool)
|
|
ad = array[T] % abbreviations for array types
|
|
ai = array[int]
|
|
|
|
lowbin: int := ad$low(limits)
|
|
bins: ai := ai$fill(lowbin, ad$size(limits)+1, 0)
|
|
|
|
for item: T in ad$elements(data) do
|
|
bin: int := lowbin
|
|
while bin <= ad$high(limits) do
|
|
if item < limits[bin] then break end
|
|
bin := bin + 1
|
|
end
|
|
bins[bin] := bins[bin] + 1
|
|
end
|
|
|
|
return(bins)
|
|
end bin_count
|
|
|
|
% Display the bins and the amount of items in each bin.
|
|
% This imposes the further restriction on the datatype
|
|
% that it allows `unparse' (may be turned into a string).
|
|
display_bins = proc [T: type] (limits, data: array[T])
|
|
where T has unparse: proctype (T) returns (string),
|
|
T has lt: proctype (T,T) returns (bool)
|
|
ad = array[T]
|
|
ai = array[int]
|
|
|
|
po: stream := stream$primary_output()
|
|
bins: ai := bin_count[T](limits, data)
|
|
|
|
for i: int in int$from_to(ad$low(limits), ad$high(limits)+1) do
|
|
lo, hi: string
|
|
if i-1 < ad$low(limits)
|
|
then lo := "-inf"
|
|
else lo := T$unparse(limits[i-1])
|
|
end
|
|
if i > ad$high(limits)
|
|
then hi := "inf"
|
|
else hi := T$unparse(limits[i])
|
|
end
|
|
|
|
stream$putright(po, lo, 5)
|
|
stream$puts(po, " - ")
|
|
stream$putright(po, hi, 5)
|
|
stream$puts(po, " : ")
|
|
stream$putright(po, int$unparse(bins[i]), 5)
|
|
stream$putl(po, "")
|
|
end
|
|
|
|
stream$putl(po, "------------------------------------------\n")
|
|
end display_bins
|
|
|
|
% Try both example inputs
|
|
start_up = proc ()
|
|
ai = array[int]
|
|
|
|
limits1: ai := ai$[23, 37, 43, 53, 67, 83]
|
|
data1: ai := ai$
|
|
[95,21,94,12,99,4,70,75,83,93,52,80,57,5,53,86,65,17,92,83,71,61,54,58,47,
|
|
16, 8, 9,32,84,7,87,46,19,30,37,96,6,98,40,79,97,45,64,60,29,49,36,43,55]
|
|
|
|
limits2: ai := ai$[14, 18, 249, 312, 389, 392, 513, 591, 634, 720]
|
|
data2: ai := ai$
|
|
[445,814,519,697,700,130,255,889,481,122,932, 77,323,525,570,219,367,523,442,933,
|
|
416,589,930,373,202,253,775, 47,731,685,293,126,133,450,545,100,741,583,763,306,
|
|
655,267,248,477,549,238, 62,678, 98,534,622,907,406,714,184,391,913, 42,560,247,
|
|
346,860, 56,138,546, 38,985,948, 58,213,799,319,390,634,458,945,733,507,916,123,
|
|
345,110,720,917,313,845,426, 9,457,628,410,723,354,895,881,953,677,137,397, 97,
|
|
854,740, 83,216,421, 94,517,479,292,963,376,981,480, 39,257,272,157, 5,316,395,
|
|
787,942,456,242,759,898,576, 67,298,425,894,435,831,241,989,614,987,770,384,692,
|
|
698,765,331,487,251,600,879,342,982,527,736,795,585, 40, 54,901,408,359,577,237,
|
|
605,847,353,968,832,205,838,427,876,959,686,646,835,127,621,892,443,198,988,791,
|
|
466, 23,707,467, 33,670,921,180,991,396,160,436,717,918, 8,374,101,684,727,749]
|
|
|
|
display_bins[int](limits1, data1)
|
|
display_bins[int](limits2, data2)
|
|
end start_up
|