You are the “computer expert” of a local Athletic Association (C.A.A.). Many teams of runners come to compete. Each time you get a string of all race results of every team who has run. For example here is a string showing the individual results of a team of 5 runners:
"01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"
Each part of the string is of the form: h|m|s
where h, m, s (h for hour, m for minutes, s for seconds) are positive or null integer (represented as strings) with one or two digits. Substrings in the input string are separated by ,
or ,
.
To compare the results of the teams you are asked for giving three statistics; range, average and median.
-
Range
: difference between the lowest and highest values. In {4, 6, 9, 3, 7} the lowest value is 3, and the highest is 9, so the range is 9 − 3 = 6. -
Mean or Average
: To calculate mean, add together all of the numbers in a set and then divide the sum by the total count of numbers. -
Median
: In statistics, the median is the number separating the higher half of a data sample from the lower half. The median of a finite list of numbers can be found by arranging all the observations from lowest value to highest value and picking the middle one (e.g., the median of {3, 3, 5, 9, 11} is 5) when there is an odd number of observations. If there is an even number of observations, then there is no single middle value; the median is then defined to be the mean of the two middle values (the median of {3, 5, 6, 9} is (5 + 6) / 2 = 5.5).
Your task is to return a string giving these 3 values. For the example given above, the string result will be
"Range: 00|47|18 Average: 01|35|15 Median: 01|32|34"
of the form: “Range: hh|mm|ss Average: hh|mm|ss Median: hh|mm|ss”`
where hh, mm, ss are integers (represented by strings) with each 2 digits.
Remarks:
- if a result in seconds is ab.xy… it will be given truncated as ab.
- if the given string is “” you will return “
#!/bin/bash stat () { num=`echo $1 | awk -F "," '{print NF}'` i=0 sum=0 ch_time () { let a=$1%60 let b=$1/60%60 let c=$1/3600 ss=`printf "%02d/n" $a` mm=`printf "%02d/n" $b` hh=`printf "%02d/n" $c` echo "$hh|$mm|$ss" } for time in `echo $1 | sed s/,//g` do hh=`echo $time | awk -F'|' '{print$1}'` mm=`echo $time | awk -F'|' '{print$2}'` ss=`echo $time | awk -F'|' '{print$3}'` let time_list[i]=hh*3600+mm*60+ss let sum=sum+time_list[i] let i++ done new_time_list=(`echo ${time_list[*]}| tr ' ' '/n'|sort -n`) let range=new_time_list[-1]-new_time_list[0] let average=sum/num let rem=num%2 if [ $rem -eq 0 ];then let mid=$num/2+1 let mid_2=$num/2 let median=(${new_time_list[mid]}+${new_time_list[mid_2]})/2 else let mid=$num/2 let median=${new_time_list[mid]} fi Range=`ch_time $range` Average=`ch_time $average` Median=`ch_time $median` echo "Range: $Range Average: $Average Median: $Median" } stat "$1"
原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/268325.html