## Perl Weekly Challenge 251: Concatenation Value

These are some answers to the Week 251, 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 January 14, 2024 at 23:59). This blog post provides 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, @ints.

Write a script to find the concatenation value of the given array.

The concatenation of two numbers is the number formed by concatenating their numerals.

``````For example, the concatenation of 10, 21 is 1021.
The concatenation value of @ints is initially equal to 0.
Perform this operation until @ints becomes empty:

If there exists more than one number in @ints, pick the first element
and last element in @ints respectively and add the value of their
concatenation to the concatenation value of @ints, then delete the
first and last element from @ints.

If one element exists, add its value to the concatenation value of
@ints, then delete it.
``````

Example 1

``````Input: @ints = (6, 12, 25, 1)
Output: 1286

1st operation: concatenation of 6 and 1 is 61
2nd operation: concaternation of 12 and 25 is 1225

Concatenation Value => 61 + 1225 => 1286
``````

Example 2

``````Input: @ints = (10, 7, 31, 5, 2, 2)
Output: 489

1st operation: concatenation of 10 and 2 is 102
2nd operation: concatenation of 7 and 2 is 72
3rd operation: concatenation of 31 and 5 is 315

Concatenation Value => 102 + 72 + 315 => 489
``````

Example 3

``````Input: @ints = (1, 2, 10)
Output: 112

1st operation: concatenation of 1 and 10 is 110
2nd operation: only element left is 2

Concatenation Value => 110 + 2 => 112
``````

### Concatenation Value in Raku

So long as there are 2 or more items in the input array, we remove from the array and retrieve the first and last item (with the `shift` and `pop` methods), concatenate their values, and add the result to the `\$concat` accumulator. At the end, we add the last item (if any) to the accumulator.

``````sub concat-vals (@in is copy) {
my \$concat;
while @in.elems > 1 {
\$concat += @in.shift ~ @in.pop;
}
\$concat += shift @in if @in.elems > 0; # last item if any
return \$concat;
}

for <6 12 25 1>, <10 7 31 5 2 2>, <1 2 10> -> @test {
printf "%-15s => ", "@test[]";
say concat-vals @test;
}
``````

This program displays the following output:

``````\$ raku ./concat-values.raku
6 12 25 1       => 1286
10 7 31 5 2 2   => 489
1 2 10          => 112
``````

### Concatenation Value in Raku

This is a port to Perl of the above Raku program. Please refer to the previous section if you need any explanations.

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

sub concat_vals {
my @in = @_;
my \$concat;
while (@in > 1) {
\$concat += (shift @in) . (pop @in);
}
\$concat += shift @in if @in > 0; # if we have 1 item left
return \$concat;
}

for my \$test ([<6 12 25 1>], [<10 7 31 5 2 2>], [<1 2 10>]) {
printf "%-15s => ", "@\$test";
say concat_vals @\$test;
}
``````

This program displays the following output:

``````\$ perl ./concat-values.pl
6 12 25 1       => 1286
10 7 31 5 2 2   => 489
1 2 10          => 112
``````

## 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 January 21, 2024. And, please, also spread the word about the Perl Weekly Challenge if you can.