# 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

- Initial version didn't check for
`1`

, I might have assumed that it was accounted for in this line`print "1\n" and exit 0 if $sorted[$#sorted] < 1;`

. - This was pointed out by https://octodon.social/@polettix - https://tilde.zone/web/statuses/104981669595493301#
- Program: perl/ch-1.pl

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:

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

### Perl

- Program: perl/ch-2.pl

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";