Turning number ranges into prefixes

David Cantrell david at cantrell.org.uk
Wed Aug 23 19:35:01 BST 2006


On Wed, Aug 23, 2006 at 02:34:39PM +0100, David Cantrell wrote:

> I have a little problem that I could do with some help with.  I have
> data specifying number ranges.  For example, 1424210000 - 1424225999.  I
> need to turn that into a list of prefixes like 142421, 1424220, 1424221,
> 1424222, 1424223, 1424224, 1424225.  That range includes all the numbers
> of the right length with those prefixes, and no others.  Is there a
> terribly clever way of generating the list?

It's not terribly clever, but I came up with this.  It's the obvious
solution, so I can't help but think there's something better.  OTOH, it
appears to work, which is good enough for now.

...
print "$min, $max\n";
    
my @minprefixes = map { substr($min, 0, $_) } reverse 1..length($min);
my @maxprefixes = map { substr($max, 0, $_) } reverse 1..length($max);
my $longest_prefix;
foreach(0 .. length($max) - 1) {
    if($minprefixes[$_] == $maxprefixes[$_]) {
        $longest_prefix = $minprefixes[$_];
        last;
    }
}
my @prefixes = try_prefix($longest_prefix, $min, $max);
print "  [".join(', ', @prefixes)."]\n";

sub try_prefix {
    my($prefix, $min, $max) = @_;
    
    my $extradigits = length($min) - length($prefix);
    return () unless($extradigits);
    
    if(
        $prefix.('0' x $extradigits) >= $min &&
        $prefix.('9' x $extradigits) <= $max
    ) {
        return $prefix;
    } else {
        return map { try_prefix($prefix.$_, $min, $max) } (0 .. 9);
    }
}

-- 
David Cantrell | WARNING: MAY CONTAIN BARYONS


More information about the london.pm mailing list