## Perl Weekly Challenge 256: Maximum Pairs

These are some answers to the Week 256, 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 February 18, 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 distinct words, `@words`.

Write a script to find the maximum pairs in the given array. The words `\$words[i]` and `\$words[j]` can be a pair one is reverse of the other.

Example 1

``````Input: @words = ("ab", "de", "ed", "bc")
Output: 1

There is one pair in the given array: "de" and "ed"
``````

Example 2

``````Input: @words = ("aa", "ba", "cd", "ed")
Output: 0
``````

Example 3

``````Input: @words = ("uv", "qp", "st", "vu", "mn", "pq"))
Output: 2
``````

### Maximum Pairs in Raku

We just run two nested loops on the input array and increment a counter whenever one word is ther reverse of another one. The Raku routine for reversing a word is flip.

``````sub find-pairs (@in) {
my \$nb-pairs = 0;
for 0..@in.end -> \$i {
for \$i^..@in.end -> \$j {
\$nb-pairs++ if @in[\$i] eq @in[\$j].flip;
}
}
return \$nb-pairs;
}

my @tests = <ab de ed bc>, <aa ba cd ed>, <uv qp st vu mn pq> ;
for @tests -> @test {
printf "%-20s => ", "@test[]";
say find-pairs @test;
}
``````

This program displays the following output:

``````\$ raku ./find-pairs.raku
ab de ed bc          => 1
aa ba cd ed          => 0
uv qp st vu mn pq    => 2
``````

### Maximum Pairs in Perl

This is a port to Perl of the above Raku program, with also two nested loops.

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

sub find_pairs {
my @in = @_;
my \$nb_pairs = 0;
for my \$i (0..\$#in) {
for my \$j (\$i + 1 ..\$#in) {
\$nb_pairs++ if \$in[\$i] eq reverse \$in[\$j];
}
}
return \$nb_pairs;
}

my @tests = ([<ab de ed bc>], [<aa ba cd ed>],
[<uv qp st vu mn pq>]);
for my \$test (@tests) {
printf "%-20s => ", "@\$test";
say find_pairs @\$test;
}
``````

This program displays the following output:

``````\$ perl ./find-pairs.pl
ab de ed bc          => 1
aa ba cd ed          => 0
uv qp st vu mn pq    => 2
``````

### Maximum Pairs in Julia

This is a port to Julia of the above Raku program, with also two nested loops. Remember that Julia array indexes start at 1, not 0.

``````using Printf

function find_pairs(in)
nb_pairs = 0
for i in 1:size(in, 1)
for j in i+1:size(in, 1)
if in[i] == reverse(in[j])
nb_pairs += 1
end
end
end
return nb_pairs
end

tests = [ ["ab", "de", "ed", "bc"],
["aa", "ba", "cd", "ed"],
["uv", "qp", "st", "vu", "mn", "pq"] ]

for test in tests
@printf "%-40s => " "\$test"
println(find_pairs(test))
end
``````

This program displays the following output:

``````\$  julia ./find-pairs.jl
["ab", "de", "ed", "bc"]                 => 1
["aa", "ba", "cd", "ed"]                 => 0
["uv", "qp", "st", "vu", "mn", "pq"]     => 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 February 25, 2024. And, please, also spread the word about the Perl Weekly Challenge if you can.