I have an array like:
my @tests = qw(1-1 1-2 1-3 1-5 2-1 2-2 2-4 3-1 3-2 4-1 4-2 6-1 6-2);
I need to validate the sequence for both number (1
) and subnumber (1-1
) subnumber means after -(hyphen) please consider as.
Expected output: Missing numbers 1-4, 2-3, 5
My code is below; where am I making a mistake?
my @tests = qw(1-1 1-2 1-3 1-5 2-1 2-2 2-4 3-1 3-2 4-1 4-2 6-1 6-2);
my %sub_numbers;
foreach my $test (@tests) {
$sub_numbers{$test} = 1; # Mark sub-number as present
}
my ($min, $max) = get_min_max_sub_numbers(\@tests);
my @missing_sub_numbers;
for my $i ($min..$max) {
for my $j (1..5) {
my $sub_number = "$i-$j";
unless ($sub_numbers{$sub_number}) {
push @missing_sub_numbers, $sub_number;
}
}
}
my @filtered_missing_sub_numbers;
foreach my $missing_sub_number (@missing_sub_numbers) {
my ($number) = split('-', $missing_sub_number);
my $previous_sub_number = ($number - 1) . "-" . substr($missing_sub_number, 2);
my $next_sub_number = ($number + 1) . "-" . substr($missing_sub_number, 2);
unless ($sub_numbers{$previous_sub_number} || $sub_numbers{$next_sub_number}) {
push @filtered_missing_sub_numbers, $missing_sub_number;
}
}
if (@filtered_missing_sub_numbers) {
print "Missing sub-numbers: " . join(", ", @filtered_missing_sub_numbers) . "\n";
} else {
print "No missing sub-numbers found.\n";
}
sub get_min_max_sub_numbers {
my ($tests_ref) = @_;
my ($min, $max) = (undef, undef);
foreach my $test (@$tests_ref) {
my ($num) = split('-', $test);
$min = $num if !defined($min) || $num < $min;
$max = $num if !defined($max) || $num > $max;
}
return ($min, $max);
}
Use hashes to remember what numbers and what tuples of numbers you've seen.
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use List::Util qw{ min max };
my @tests = qw(1-1 1-2 1-3 1-5 2-1 2-2 2-4 3-1 3-2 4-1 4-2 6-1 6-2);
my %seen;
for my $tuple (@tests) {
my ($first, $second) = split /-/, $tuple;
undef $seen{$first}{$second};
}
my $min = min(keys %seen);
my $max = max(keys %seen);
my @missing;
for my $i ($min .. $max) {
if (exists $seen{$i}) {
my $s_min = min(keys %{ $seen{$i} });
my $s_max = max(keys %{ $seen{$i} });
for my $j ($s_min .. $s_max) {
push @missing, "$i-$j" unless exists $seen{$i}{$j};
}
} else {
push @missing, $i;
}
}
say join ', ', @missing;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With