http://www.perlmonks.org?node_id=79987


in reply to "Junkyard" Puzzle: Average of Numbers

First of all, Perl is list-oriented and handles passed in arguments by reference. Therefore the Perlish way to do this is to just take a list of numbers and work with that. But I will play off the rule as given even though it is not the API I would choose.

Also the stricture to avoid having any variables should not be looked at as just a bizarre restriction. People who program in a functional style often do that voluntarily. With that in mind I offer the following version that follows the restrictions as a matter of intentional style and just happens to solve a more complex problem. The function is avg_nested which extracts the numbers from a nested set of arrays of arrays and computes the average of the entire list:

sub avg { sum(@_) / @_; } sub avg_nested { avg(flatten_arrays(@_)); } sub flatten_arrays { map {ref($_) ? flatten_arrays(@$_) : $_} @_; } sub sum { @_ ? shift(@_) + sum(@_) : 0; }

UPDATE
jynx caught me. I wrote it, then changed a function name at the last minute and didn't test properly. I forgot to change one flatten to flatten_arrays...

Replies are listed 'Best First'.
Re: Re (tilly) 1: "Junkyard" Puzzle: Average of Numbers
by Masem (Monsignor) on May 13, 2001 at 16:10 UTC
    First of all, Perl is list-oriented and handles passed in arguments by reference. Therefore the Perlish way to do this is to just take a list of numbers and work with that. But I will play off the rule as given even though it is not the API I would choose.

    I know this is the case, what I was trying to prevent doing was giving the 'player' the opporuntity to use the copy of the list if the list was passed by value; they could modify this with no concern over altering the original array. (So, for example, doing something that stores the sum in some place in the list copy, would be possible). However, with passing by reference, any changes to the sub's array would affect the original array, and thus you are forced to find another means to store the value.


    Dr. Michael K. Neylon - mneylon-pm@masemware.com || "You've left the lens cap of your mind on again, Pinky" - The Brain