How about
my ($longest) = reduce { length($a) >= length($b) ? $a : $b } / ( [0-9] (?: (?: (?<=0)1 | (?<=1)2 | (?<=2)3 | (?<=3)4 | (?<=4)5 | (?<=5)6 | (?<=6)7 | (?<=7)8 | (?<=8)9 | (?<=9)0 )+ | (?: (?<=0)9 | (?<=1)0 | (?<=2)1 | (?<=3)2 | (?<=4)3 | (?<=5)4 | (?<=6)5 | (?<=7)6 | (?<=8)7 | (?<=9)8 )+ ) ) /xg;
And I thought contiguous would be easier than non-contiguous.
Update: No, that's not right. Endpoints can belong to an ascending and a descending series.
my ($longest) = reduce { length($a) >= length($b) ? $a : $b } / ( [0-9] (?: (?<=0)1 | (?<=1)2 | (?<=2)3 | (?<=3)4 | (?<=4)5 | (?<=5)6 | (?<=6)7 | (?<=7)8 | (?<=8)9 | (?<=9)0 )+ ) /xg, / ( [0-9] (?: (?<=0)9 | (?<=1)0 | (?<=2)1 | (?<=3)2 | (?<=4)3 | (?<=5)4 | (?<=6)5 | (?<=7)6 | (?<=8)7 | (?<=9)8 )+ ) /xg;
Update: This can be simplified if you just want the length of the longest rather than the sequence itself.
my $longest = max map length, / ( (?: 1(?=2) | 2(?=3) | 3(?=4) | 4(?=5) | 5(?=6) | 6(?=7) | 7(?=8) | 8(?=9) | 9(?=0) | 0(?=1) )+ | (?: 1(?=0) | 2(?=1) | 3(?=2) | 4(?=3) | 5(?=4) | 6(?=5) | 7(?=6) | 8(?=7) | 9(?=8) | 0(?=9) )+ ) /xg; if (defined($longest)) { ++$longest; } else { $longest = /[0-9]/ ? 1 : 0; }
Ok, maybe not simpler.
I could save typing by using reverse, but it would be a bit slower.
In reply to Re: Find Length Of Longest Ascending/Descending Sequence
by ikegami
in thread Find Length Of Longest Ascending/Descending Sequence
by Limbic~Region
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |