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 :)
In reply to Re^3: Find Length Of Longest Ascending/Descending Sequence
by BrowserUk
in thread Find Length Of Longest Ascending/Descending Sequence
by Limbic~Region
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |