Tonight’s music doesn’t have anything to do with the tasks; it’s just the soundtrack while I was writing up, as my wife calls it, “my cooking blog”.
Onward to the solutions for Perl Weekly Challenge 262!
Task 1: Max Positive Negative
You are given an array of integers, @ints
.
Write a script to return the maximum number of either positive or negative integers in the given array.
Example 1
Input: @ints = (-3, 1, 2, -1, 3, -2, 4)
Output: 4
Count of positive integers: 4
Count of negative integers: 3
Maximum of count of positive and negative integers: 4
Example 2
Input: @ints = (-1, -2, -3, 1)
Output: 3
Count of positive integers: 1
Count of negative integers: 3
Maximum of count of positive and negative integers: 3
Example 3
Input: @ints = (1,2)
Output: 2
Count of positive integers: 2
Count of negative integers: 0
Maximum of count of positive and negative integers: 2
Approach
Really, this is two loops over the array of integers. One to count positive ints, one to count negative ints. If I do a map
of the array each time and return 1 for each int I want to count and 0 for each int I don’t want to count, I can do the counting with a sum
operator.
Raku
Like last week, we use Raku’s Reduction Metaoperator with addition ([+]
) for the summation, and the max
routine on the Any class to pick the maximum.
sub maxPosNeg(@ints) {
my $pos = [+] @ints.map({ $_ > 0 ?? 1 !! 0 });
my $neg = [+] @ints.map({ $_ < 0 ?? 1 !! 0 });
my $max = max $pos, $neg;
return (
$max,
(
"Count of positive integers: $pos",
"Count of negative integers: $neg",
"Maximum of count of positive and " ~
"negative integers: $max"
).join("\n")
);
}
Yes, it looks like Perl.
$ raku/ch-1.raku
Example 1:
Input: @arr = (-3, 1, 2, -1, 3, -2, 4)
Output: 4
Count of positive integers: 4
Count of negative integers: 3
Maximum of count of positive and negative integers: 4
Example 2:
Input: @arr = (-1, -2, -3, 1)
Output: 3
Count of positive integers: 1
Count of negative integers: 3
Maximum of count of positive and negative integers: 3
Example 3:
Input: @arr = (1, 2)
Output: 2
Count of positive integers: 2
Count of negative integers: 0
Maximum of count of positive and negative integers: 2
View the entire Raku script for this task on GitHub.
Perl
In Perl, we can get max
and sum
from List::Util.
sub maxPosNeg(@ints) {
my $pos = sum map { $_ > 0 ? 1 : 0 } @ints;
my $neg = sum map { $_ < 0 ? 1 : 0 } @ints;
my $max = max $pos, $neg;
return (
$max,
join("\n",
"Count of positive integers: $pos",
"Count of negative integers: $neg",
"Maximum of count of positive and " .
"negative integers: $max"
)
);
}
View the entire Perl script for this task on GitHub.
Python
For Python, sum
and max
are built in and don’t need to be pulled in from a library.
def maxPosNeg(ints):
pos = sum([1 for i in ints if i > 0])
neg = sum([1 for i in ints if i < 0])
maxCount = max(pos, neg)
return (
maxCount,
"\n".join([
f"Count of positive integers: {pos}",
f"Count of negative integers: {neg}",
f"Maximum of count of positive and " +
f"negative integers: {maxCount}"
])
)
View the entire Python script for this task on GitHub.
Task 2: Count Equal Divisible
You are given an array of integers, @ints
and an integer $k
.
Write a script to return the number of pairs (i, j) where
a) 0 <= i < j < size of @ints
b) ints[i] == ints[j]
c) i x j is divisible by k
Example 1
Input: @ints = (3,1,2,2,2,1,3) and $k = 2
Output: 4
(0, 6) => ints[0] == ints[6] and 0 x 6 is divisible by 2
(2, 3) => ints[2] == ints[3] and 2 x 3 is divisible by 2
(2, 4) => ints[2] == ints[4] and 2 x 4 is divisible by 2
(3, 4) => ints[3] == ints[4] and 3 x 4 is divisible by 2
Example 2
Input: @ints = (1,2,3) and $k = 1
Output: 0
Approach
Ok, let’s look at these criteria:
0 <= i < j < size of @ints
. For a 0-indexed array, it means that both i
and j
are indices of the array (the 0 <=
and < size of @ints
parts) and that i < j
. Not a big deal.
ints[i] == ints[j]
means the numbers at these indices are the same. So Example 2 fails this criteria because none of the numbers are the same.
i x j is divisible by k
. Really, this is the big condition.
As with the last task, we’re counting.
Raku
Here I’m leaning into the Raku looking like Perl.
sub countEquDiv($k, @ints) {
my @explain;
my $cnt = 0;
for 0 .. @ints.end - 1 -> $i {
for $i + 1 .. @ints.end -> $j {
# does ints[i] == ints[j]?
next unless @ints[$i] == @ints[$j];
# is i x j divisible by k?
next unless ( ($i * $j) mod $k ) == 0;
# count the pair and explain why
$cnt++;
@explain.push(
"($i, $j) => ints[$i] == ints[$j] " ~
"and $i x $j is divisible by $k"
);
}
}
return($cnt, @explain.join("\n"));
}
$ raku/ch-2.raku
Example 1:
Input: @arr = (3, 1, 2, 2, 2, 1, 3) and $k = 2
Output: 4
(0, 6) => ints[0] == ints[6] and 0 x 6 is divisible by 2
(2, 3) => ints[2] == ints[3] and 2 x 3 is divisible by 2
(2, 4) => ints[2] == ints[4] and 2 x 4 is divisible by 2
(3, 4) => ints[3] == ints[4] and 3 x 4 is divisible by 2
Example 2:
Input: @arr = (1, 2, 3) and $k = 1
Output: 0
View the entire Raku script for this task on GitHub.
Perl
sub countEquDiv($k, @ints) {
my @explain;
my $cnt = 0;
foreach my $i ( 0 .. $#ints - 1 ) {
foreach my $j ( $i + 1 .. $#ints ) {
# does ints[i] == ints[j]?
next unless $ints[$i] == $ints[$j];
# is i x j divisible by k?
next unless ( ($i * $j) % $k ) == 0;
# count the pair and explain why
$cnt++;
push @explain,
"($i, $j) => ints[$i] == ints[$j] " .
"and $i x $j is divisible by $k";
}
}
return($cnt, join("\n", @explain));
}
View the entire Perl script for this task on GitHub.
Python
Here I’m leaning into the Python looking like Perl. I mean, except for the lack of block delimiters and sigils, how can you NOT think this looks like perl?
def countEquDiv(k, ints):
explain = []
cnt = 0
for i in range(len(ints) - 1):
for j in range(i+1, len(ints)):
# does ints[i] == ints[j]?
if not ints[i] == ints[j]: break
# is i x j divisible by k?
if not ( (i * j) % k ) == 0: break
# count the pair and explain why
cnt += 1
explain.append(
f"({i}, {j}) => ints[{i}] == ints[{j}] " +
f"and {i} x {j} is divisible by {k}"
)
return(cnt, "\n".join(explain))
View the entire Python script for this task on GitHub.
Here’s all my solutions in GItHub: https://github.com/packy/perlweeklychallenge-club/tree/master/challenge-262/packy-anderson