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