Peter’s blog ✴ Week 351 ✴ 8 December 2025
THE WEEKLY CHALLENGE
Fun with arrays
You are given an array of integers. Write a script to return the average excluding the minimum and maximum of the given array.
Example 1 Input: @ints = (8000, 5000, 6000, 2000, 3000, 7000) Output: 5250 Min: 2000 Max: 8000 Avg: (3000+5000+6000+7000)/4 = 21000/4 = 5250 Example 2 Input: @ints = (100_000, 80_000, 110_000, 90_000) Output: 95_000 Min: 80_000 Max: 110_000 Avg: (100_000 + 90_000)/2 = 190_000/2 = 95_000 Example 3 Input: @ints = (2500, 2500, 2500, 2500) Output: 0 Min: 2500 Max: 2500 Avg: 0 Example 4 Input: @ints = (2000) Output: 0 Min: 2000 Max: 2000 Avg: 0 Example 5 Input: @ints = (1000, 2000, 3000, 4000, 5000, 6000) Output: 3500 Min: 1000 Max: 6000 Avg: (2000 + 3000 + 4000 + 5000)/4 = 14000/4 = 3500
On the KISS principle (Keep It Simple, Stupid) I sorted the array, summed from the 2nd to the 2nd last elements and divided by the length of the array minus 2.
That's nice readable code, but is it efficient? I tried it with a million random integers in the range 0 - 999,999 and it came up with 499595.1 in under 2 seconds - and about half of that was used to generate the random numbers. So I think that's fast enough.
I take slight issue with example 4 which regards the average of an empty set of numbers as being 0; for the task as stated I treat the input as invalid unless there are at least 3 elements in the array. In real life one would ask the client what they want to happen if there were fewer than 3.
This is a well-structured, practical implementation with good documentation and error handling. Peter demonstrates solid Perl programming practices while making reasonable design decisions based on their interpretation of the problem requirements.
This review may cover either or both challenges for this week.
#!/usr/bin/perl # Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge use v5.26; # The Weekly Challenge - 2025-12-08 use utf8; # Week 351 - task 1 - Special average use warnings; # Peter Campbell Smith binmode STDOUT, ':utf8'; use Encode; special_average(8000, 5000, 6000, 2000, 3000, 7000); special_average(100_000, 80_000, 110_000, 90_000); special_average(2500, 2500, 2500, 2500); special_average(1, 3); sub special_average { my (@sorted, $sum); # initialise say qq[\nInput: (] . join(', ', @_) . ')'; # need at lleast 3 elements if (@_ > 2) { # calculate average @sorted = sort {$a <=> $b} @_; $sum += $sorted[$_] for 1 .. @sorted - 2; say qq[Output: ] . ($sum / (@sorted - 2)); # error } else { say qq[Output: need at least 3 elements]; } }
9 lines of code
Input: (8000, 5000, 6000, 2000, 3000, 7000) Output: 5250 Input: (100000, 80000, 110000, 90000) Output: 95000 Input: (2500, 2500, 2500, 2500) Output: 2500 Input: (1, 3) Output: need at least 3 elements
Any content of this website which has been created by Peter Campbell Smith is in the public domain