note
tilly
(Posted at [MeowChow]'s request.)<P>
My best is 77:
<code>
sub p{
@m=1;for$p(@_){my@t;for$i(0..@m){my$j;$t[$i+$j++]+=$_*$m[$i]for@$p}@m=@t}[@m]
}
</code>
Note that this introduces 0's through a fencepost error,
but they don't change which polynomial is represented. I
think this is fair, but if you think that is cheating, you
can not save that character:
<code>
sub p{
@m=1;for$p(@_){my@t;for$i(0..$#m){my$j;$t[$i+$j++]+=$_*$m[$i]for@$p}@m=@t}[@m]
}
</code>
The trick lies in finding ways to not work through explicit
lookups by index, and in finding ways to not access
arrays through references. In fact there is not a single
lookup by index of an element in an array reference. (It
was cheaper to create and manually increment the index
variable.)<P>
BTW note that the statement of the rules anticipated and
forbade saving a character by ending with \@m without
making @m a private variable.<P>
Finally at a request from chatter, here is the solution
broken out and commented:
<code>
sub p{
@m=1; # Start the product at 1.
for$p(@_){ # Loop over the polynomials.
my@t; # Create a private temp array.
for$i(0..@m){ # Loop over the indexes of @m.
my$j; # Create the *other* index var.
$t[$i+$j++]+= # Manually increment $j while..
# Adding to the index of @t..
$_*$m[$i] # 2 terms multiplied together..
for@$p # for all the terms in the..
} # other polynomial.
@m=@t # Make the temp array our new
} # product.
[@m] # Return our answer in the
} # desired form.
</code><P>
<B>UPDATE</B><BR>
Never say you are done, 2 more characters:
<code>
sub p{
@m=1;for$p(@_){my@t;for$i(0..@m){$j=$i;$t[$j++]+=$_*$m[$i]for@$p}@m=@t}[@m]
}
</code><P>
<B>UPDATE 2</B><BR>
(This is a couple of days later.) Truly never say never,
there were 2 more wasted characters to 73:
<code>
sub p{
@m=1;for$p(@_){$i=my@t;for$,(@m){$j=$i++;$t[$j++]+=$_*$,for@$p}@m=@t}[@m]
}
</code>
78498
78588