site.base_url }}/">The Bear's Den -->

The Bear's Den

Enter at your own risk

Positive, Negative or Divisible?

Task 1: Max Positive Negative

Submitted by: Mohammad Sajid Anwar


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

Solution

The values returned from the numeric equality operator <=> may be used as an array index to count positive and negative values. Ignoring zeros, the maximum over the first and the last array element is the requested count.

use v5.24;
use warnings;
use List::Util qw(max reduce);

sub mpn {
    max +(reduce {$a->[1 + ($b <=> 0)]++; $a} [0,0,0], @_)->@[0,2];
}

See the full solution.

Task 2: Count Equal Divisible

Submitted by: Mohammad Sajid Anwar


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

Solution

The task can be translated to PDL almost literally:

An important detail is the usage of the bitwise AND operator & instead of the logical AND operator && that cannot be overloaded.

use strict;
use warnings;
use PDL;

sub ced {
    my $k = shift;
    my $ints = long @_;
    my $i = sequence($ints);
    my $j = $i->dummy(0);

    which(($j > $i) & ($ints->dummy(0) == $ints) & ! ($i * $j % $k))->nelem;
}

See the full solution.