UP / HOME

Challenge 080

Table of Contents

Task 1 - Smallest Positive Number Bits

You are given unsorted list of integers @N.

Write a script to find out the smallest positive number missing.

Perl

We take input from @ARGV, sort it & remove all inputs less than 1. We check if the smallest positive number is 1. We filter repeated inputs using %hash.

my %hash;
%hash = map { $_ => 1 } @ARGV;

my @sorted = sort { $a <=> $b } keys %hash;

# Print 1 if there are no positive numbers in @sorted.
print "1\n" and exit 0 if $sorted[$#sorted] < 1;

while (my $arg = shift @sorted) {
    next if $arg < 1;
    print "1\n" and exit 0 unless $arg == 1;
    last;
}

Now we are sure the smallest positive number is not 1 & @sorted doesn't contain any number less than 2.

We loop from 2 ... $sorted[$#sorted] + 1 & then over @sorted array. The first number from the array is dropped if it's equal to $num. If not then $num is the smallest positive number, we print it & exit the MAIN loop.

This won't print the smallest positive number if the user passed consecutive set of numbers, we just add print "$num\n" at the end to cover this case.

MAIN: foreach my $num (2 ... $sorted[$#sorted] + 1) {
    foreach (@sorted) {
        shift @sorted and next MAIN if $num == $_;
        print "$num\n" and last MAIN;
    }
    # Print the last element if it was a continous series of positive
    # numbers.
    print "$num\n";
}

Task 2 - Count Candies

You are given rankings of @N candidates.

Write a script to find out the total candies needed for all candidates. You are asked to follow the rules below:

  1. You must given at least one candy to each candidate.
  2. Candidate with higher ranking get more candies than their mmediate neighbors on either side.

Perl

Giving at least one day to all candidates.

my $candies = scalar @ARGV;

Handling first & last index, we do this outside the loop to keep it simple.

$candies++ if $ARGV[0] > $ARGV[1];
$candies++ if $ARGV[$#ARGV] > $ARGV[$#ARGV - 1];

Loop handles rest of the entries.

foreach my $index (1 ... $#ARGV - 1) {
    $candies++ if $ARGV[$index] > $ARGV[$index - 1];
    $candies++ if $ARGV[$index] > $ARGV[$index + 1];
}

print "$candies\n";

Andinus / / Modified: 2022-10-04 Tue 21:34 Emacs 27.2 (Org mode 9.4.4)