## Perl Weekly Challenge 269: Distribute Elements

These are some answers to the Week 269, Task 2, 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 May 19, 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 2: Distribute Elements

You are given an array of distinct integers, `@ints`.

Write a script to distribute the elements as described below:

1) Put the 1st element of the given array to a new array @arr1. 2) Put the 2nd element of the given array to a new array @arr2.

Once you have one element in each arrays, `@arr1` and `@arr2`, then follow the rule below:

If the last element of the array `@arr1` is greater than the last element of the array `@arr2` then add the first element of the given array to `@arr1` otherwise to the array `@arr2`.

When done distribution, return the concatenated arrays. `@arr1` and `@arr2`.

Example 1

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

1st operation:
Add 1 to @arr1 = (2)

2nd operation:
Add 2 to @arr2 = (1)

3rd operation:
Now the last element of @arr1 is greater than the last element
of @arr2, add 3 to @arr1 = (2, 3).

4th operation:
Again the last element of @arr1 is greate than the last element
of @arr2, add 4 to @arr1 = (2, 3, 4)

5th operation:
Finally, the last element of @arr1 is again greater than the last
element of @arr2, add 5 to @arr1 = (2, 3, 4, 5)

Now we have two arrays:
@arr1 = (2, 3, 4, 5)
@arr2 = (1)

Concatenate the two arrays and return the final array: (2, 3, 4, 5, 1).
``````

Example 2

``````Input: @ints = (3, 2, 4)
Output: (3, 4, 2)

1st operation:
Add 1 to @arr1 = (3)

2nd operation:
Add 2 to @arr2 = (2)

3rd operation:
Now the last element of @arr1 is greater than the last element
of @arr2, add 4 to @arr1 = (3, 4).

Now we have two arrays:
@arr1 = (3, 4)
@arr2 = (2)

Concatenate the two arrays and return the final array: (3, 4, 2).
``````

Example 3

``````Input: @ints = (5, 4, 3 ,8)
Output: (5, 3, 4, 8)

1st operation:
Add 1 to @arr1 = (5)

2nd operation:
Add 2 to @arr2 = (4)

3rd operation:
Now the last element of @arr1 is greater than the last element
of @arr2, add 3 to @arr1 = (5, 3).

4th operation:
Again the last element of @arr2 is greate than the last element
of @arr1, add 8 to @arr2 = (4, 8)

Now we have two arrays:
@arr1 = (5, 3)
@arr2 = (4, 8)

Concatenate the two arrays and return the final array: (5, 3, 4, 8).
``````

### Distribute Elements in Raku

We can hardly do anything else than just follow the procedure described in the task specification.

``````sub distribute-elements (@in is copy) {
my @arr1 = shift @in;
my @arr2 = shift @in;
for @in -> \$item {
if @arr1[*-1] > @arr2[*-1] {
push @arr1, \$item;
} else {
push @arr2, \$item;
}
}
return (@arr1, @arr2).flat;
}
my @tests = <2 1 3 4 5>, <3 2 4>, <5 4 3 8>;
for @tests -> @test {
printf "%-10s => ", "@test[]";
say distribute-elements @test;
}
``````

This program displays the following output:

``````\$ raku ./distribute-elements.raku
2 1 3 4 5  => (2 3 4 5 1)
3 2 4      => (3 4 2)
5 4 3 8    => (5 3 4 8)
``````

### Distribute Elements in Perl

This is a port to Perl of the above Raku program.

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

sub distribute_elements {
my @arr1 = shift;
my @arr2 = shift;
for my \$item (@_) {
if (\$arr1[-1] > \$arr2[-1]) {
push @arr1, \$item;
} else {
push @arr2, \$item;
}
}
return "@arr1 @arr2";
}
my @tests = ( [<2 1 3 4 5>], [<3 2 4>], [<5 4 3 8>] );
for my \$test (@tests) {
printf "%-10s => ", "@\$test";
say distribute_elements @\$test;
}
``````

This program displays the following output:

``````\$ perl ./distribute-elements.pl
2 1 3 4 5  => 2 3 4 5 1
3 2 4      => 3 4 2
5 4 3 8    => 5 3 4 8
``````

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