## Perl Weekly Challenge 238: Running Sum

These are some answers to the Week 238, Task 1 of the Perl Weekly Challenge organized by Mohammad S. Anwar.

Spoiler Alert: This weekly challenge deadline is due in a few days from now (on October 15, 2023 at 23:59). This blog post offers some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.

You are given an array of integers.

Write a script to return the running sum of the given array. The running sum can be calculated as sum[i] = num[0] + num[1] + …. + num[i].

Example 1

``````Input: @int = (1, 2, 3, 4, 5)
Output: (1, 3, 6, 10, 15)
``````

Example 2

``````Input: @int = (1, 1, 1, 1, 1)
Output: (1, 2, 3, 4, 5)
``````

Example 3

``````Input: @int = (0, -1, 1, 2)
Output: (0, -1, 0, 2)
``````

### Running Sum in Raku

We use the `[...]` reduction meta-operator. When the wrapped operator is prefixed with a `\`, the reduction meta-operator returns a lazy list of all intermediate values. It is sometimes called a "triangular reduce". This leads to a very concise one-liner solution:

``````sub running-sum (@in) {
return [\+] @in;
}

my @tests = <1 2 3 4 5>, <1 1 1 1 1>, <0 -1 1 2>;
for @tests -> @test {
printf "%-15s => ", "@test[]";
say join ", ", running-sum @test;
}
``````

This program displays the following output:

``````\$ raku ./running-sum.raku
1 2 3 4 5       => 1, 3, 6, 10, 15
1 1 1 1 1       => 1, 2, 3, 4, 5
0 -1 1 2        => 0, -1, 0, 2
``````

### Running Sum in Perl

Perl doesn't have a reduction meta-operator, so we use a simple loop to compute the items of the running sum.

``````use strict;
use warnings;
use feature 'say';

sub running_sum {
my @sum = shift;
for my \$item (@_) {
push @sum, \$item + \$sum[-1];
}
return @sum;
}

my @tests = ([<1 2 3 4 5>], [<1 1 1 1 1>], [<0 -1 1 2>]);
for my \$test (@tests) {
printf "%-15s => ", "@\$test";
say join ", ", running_sum @\$test;
}
``````

This program displays the following output:

``````\$ perl ./running-sum.pl
1 2 3 4 5       => 1, 3, 6, 10, 15
1 1 1 1 1       => 1, 2, 3, 4, 5
0 -1 1 2        => 0, -1, 0, 2
``````

## Wrapping up

The next week Perl Weekly Challenge will start soon. If you want to participate in this challenge, please check https://perlweeklychallenge.org/ and make sure you answer the challenge before 23:59 BST (British summer time) on October 22, 2023. And, please, also spread the word about the Perl Weekly Challenge if you can.