# Challenge 080

## 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 > \$ARGV;
\$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: 2021-10-11 Mon 19:56 Emacs 27.2 (Org mode 9.4.4)