Peter’s blog ✴ Week 262 ✴ 25 March 2024

THE WEEKLY CHALLENGE
Plus versus minus

The Perl Camel

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.

Examples


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

Analysis

This is an easy one-liner:
$count[$_ < 0 ? 0 : 1] ++ for @ints;

which leaves the number of negatives in $count[0] and the number of positives in $count[1].

We're not told how to handle zero, but my code would regard it as positive.

Perl Weekly’s review

from Perl Weekly issue 662

Pure Perl solution with just basic language feature. DIY tool for you try as well.

Try it 

Try running the script with any input:



example: 1, 2, 3, -1, -2, -3, -4

Script


#!/usr/bin/perl

# Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge

use v5.26;    # The Weekly Challenge - 2024-03-25
use utf8;     # Week 262 - task 1 - Max positive negative
use warnings; # Peter Campbell Smith
binmode STDOUT, ':utf8';

my (@ints, $j, $num);

max_positive_negative(-3, 1, 2, -1, 3, -2, 4);
max_positive_negative(-1, -2, -3, 1);
max_positive_negative(1, 2);

# larger example
$j = 0;
while ($j < 100) {
    $num = int(rand(100)) - 50;
    $ints[$j ++] = $num if $num;
}
max_positive_negative(@ints);

sub max_positive_negative {
    
    my (@ints, @count);
    
    # initialise
    @ints = @_;
    @count = (0, 0);
    
    # count positive and negative values
    $count[$_ < 0 ? 0 : 1] ++ for @ints;
    
    # show result
    say qq[\nInput:  \@ints = (] . join(', ', @ints) . q[)];
    say qq[Output: ] . ($count[0] > $count[1] ? $count[0] : $count[1]) .
        qq[ ($count[0] negative, $count[1] positive)];
}

8 lines of code

Output from script


Input:  @ints = (-3, 1, 2, -1, 3, -2, 4)
Output: 4 (3 negative, 4 positive)

Input:  @ints = (-1, -2, -3, 1)
Output: 3 (3 negative, 1 positive)

Input:  @ints = (1, 2)
Output: 2 (0 negative, 2 positive)

Input:  @ints = (-15, -37, -43, -34, 22, 43, -30, -14, 20,
46, -13, 31, -32, 48, -4, -35, 10, -42, -10, 36, 30, -12,
-4, -5, 14, 46, 49, 4, 7, -26, -41, 10, -22, 36, -20, -11,
28, -27, -5, -22, -22, 18, 12, 29, -43, 40, -8, -13, 44,
3, 23, -4, -23, 13, -37, -19, -24, -29, -2, 26, -6, 30,
22, -50, -28, -31, -48, 6, -14, -26, 27, -42, 5, 32, -5,
-2, 38, 47, 18, 2, 2, 34, 10, -22, -24, -48, 5, 49, -28,
18, -21, -26, 17, 35, -18, 39, 19, -37, 9, 2)
Output: 52 (52 negative, 48 positive)

 

Any content of this website which has been created by Peter Campbell Smith is in the public domain