RabbitFarm

2022-10-30

Pairs Divided by Zero

The examples used here are from the weekly challenge problem statement and demonstrate the working solution.

Part 1

You are given list of integers @list of size \$n and divisor \$k. Write a script to find out count of pairs in the given list that satisfies a set of rules.

Solution

``````
use v5.36;
use strict;
use warnings;

sub divisible_pairs{
my(\$numbers, \$k) = @_;
my @pairs;
for my \$i (0 .. @{\$numbers} - 1){
for my \$j (\$i + 1 .. @{\$numbers} - 1){
push @pairs, [\$i, \$j] if((\$numbers->[\$i] + \$numbers->[\$j]) % \$k == 0);
}
}
return @pairs;
}

MAIN:{
my @pairs;
@pairs = divisible_pairs([4, 5, 1, 6], 2);
print @pairs . "\n";
@pairs = divisible_pairs([1, 2, 3, 4], 2);
print @pairs . "\n";
@pairs = divisible_pairs([1, 3, 4, 5], 3);
print @pairs . "\n";
@pairs = divisible_pairs([5, 1, 2, 3], 4);
print @pairs . "\n";
@pairs = divisible_pairs([7, 2, 4, 5], 4);
print @pairs . "\n";
}
``````

Sample Run

``````
\$ perl perl/ch-1.pl
2
2
2
2
1
``````

Notes

The rules, if not clear from the above code are : the pair (i, j) is eligible if and only if

• 0 <= i < j < len(list)

• list[i] + list[j] is divisible by k

While certainly possible to develop a more complicated looking solution using `map` and `grep` I found myself going with nested `for` loops. The construction of the loop indices takes care of the first condition and the second is straightforward.

Part 2

You are given two positive integers \$x and \$y. Write a script to find out the number of operations needed to make both ZERO.

Solution

``````
use v5.36;
use strict;
use warnings;

sub count_zero{
my(\$x, \$y) = @_;
my \$count = 0;
{
my \$x_original = \$x;
\$x = \$x - \$y if \$x >= \$y;
\$y = \$y - \$x_original if \$y >= \$x_original;
\$count++;
redo unless \$x == 0 && \$y == 0;
}
return \$count;
}

MAIN:{
say count_zero(5, 4);
say count_zero(4, 6);
say count_zero(2, 5);
say count_zero(3, 1);
say count_zero(7, 4);
}
``````

Sample Run

``````
\$ perl perl/ch-2.pl
5
3
4
3
5
``````

Notes

The operations are dictated by these rules:

• `\$x = \$x - \$y if \$x >= \$y`

or

• `\$y = \$y - \$x if \$y >= \$x (using the original value of \$x)`

This problem seemed somewhat confusingly stated at first. I had to work through the first given example by hand to make sure I really understood what was going on.

After a little analysis I realized this is not as confusing as I first thought. The main problem I ran into was not properly accounting for the changed value of `\$x` using a temporary variable `\$x_original`. If you see my Prolog Solutions for this problem you can see how Prolog's immutable variables obviate this issue!

References

Challenge 188

posted at: 19:24 by: Adam Russell | path: /perl | permanent link to this entry