Task1
We count the number of consecutive elements according to this algorithm. (We can also use a simple Perl hash instead of the Set::Scalar module):
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw(max);
use Set::Scalar;
sub consecutive_sequence{
my ($arr) = @_;
my $s = Set::Scalar->new(@$arr);
my $res = 0;
foreach my $i(0..$#$arr){
unless($s->has($arr->[$i]-1)){
my $j = $arr->[$i];
$j++ while($s->has($j));
$res = max($res,$j - $arr->[$i])
}
}
$res == 1 ? -1 : $res
}
printf "%d\n",consecutive_sequence([10,4,20,1,3,2]);
printf "%d\n",consecutive_sequence([0,6,1,8,5,2,4,3,0,7]);
printf "%d\n",consecutive_sequence([10,30,20]);
Task2
We find the next permutation of the array according to this algorithm.
#!/usr/bin/env perl
use strict;
use warnings;
sub next_permutation{
my ($arr) = @_;
my $p = -1;
for(my $i = $#$arr-1; $i >= 0; --$i){
do{$p = $i; last}if($arr->[$i] < $arr->[$i+1])
}
return reverse @$arr if $p == -1;
for(my $i = $#$arr; $i >= $p+1; --$i){
if($arr->[$i] > $arr->[$p]){
($arr->[$i],$arr->[$p]) = ($arr->[$p],$arr->[$i]);
last
}
}
@$arr
}
printf "(%s)\n",join ', ',next_permutation([1,2,3]);
printf "(%s)\n",join ', ',next_permutation([2,1,3]);
printf "(%s)\n",join ', ',next_permutation([3,1,2]);