I am only interested in the length of the longest
In that case, this should work. Nothing special, but just one pass of the string:
#! perl -slw
use strict;
sub z {
my $soFar = 1;
my $lastC = substr $_[0], 0, 1;
my $lastS = $lastC <=> substr $_[0], 1, 1;
my $bestN = 0;
for my $p ( 1 .. length( $_[0] )-1 ) {
my $this = substr $_[0], $p, 1;
my $d = abs( $this - $lastC );
my $s = $this <=> $lastC;
$s *= -1 if $d == 9;
if( $s != $lastS or $d != 1 and $d != 9 ) {
$soFar = 1;
$lastS = $s;
}
if( ++$soFar > $bestN ) {
$bestN = $soFar;
}
$lastC = $this;
}
return $bestN;
}
while( <DATA> ) {
chomp;
my $l = z( $_ );
print $_, ' : ', $l;
}
__DATA__
01234567890987654321
01234567890123456789
78901234567890123456
98765432109876543210
21098765432109876543
012345678890123456789
789012345677890123456
987654321099876543210
210987654322109876543
012345678900987654321
That is one nasty, messy problem :)
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|