## 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.

## Task 1: Concatenation Value

*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.

## Leave a comment