in reply to Find Length Of Longest Ascending/Descending Sequence

2 approaches by calculating the string of modulo distances of two neighboring digits

Any sequence of consecutive 1 or 9 reflects ascending or descending sequences.

The difficulty is to get all overlapping pairs in an elegant way w/o trouble with edge cases.

Version 1 manipulates pos() of m//g

Version 2 uses reduce {...;$b}

use List::Util qw/max reduce/; while(<DATA>){ chomp; #-- Version 1 my $diff=""; while (/(\d)(\d)/g) { $diff.=($2-$1)%10; pos($_)--; } my $v1= 1 + max map { length } $diff =~ m/(1+|9+)/g; #--- Version 2 $diff=""; reduce { $diff.=($a-$b)%10; $b} split //; my $v2= 1 + max map { length } $diff =~ m/(1+|9+)/g; print "V1: $v1 V2: $v2 $_\n"; } __DATA__ 461771621368210983721913243963580233112903255149955120374576

Cheers Rolf

Replies are listed 'Best First'.
Re^2: Find Length Of Longest Ascending/Descending Sequence
by ambrus (Abbot) on May 20, 2011 at 12:20 UTC

    Does this /(\d)(\d)/g; pos($_)--; thing have some advantage over /(\d)(?=\d)/g; ? I mean, I wouldn't be surprised if it made sense given the strange hacks with pos() I've seen, but could you give some explanation please?

      Did you try it? :)

      Cheers Rolf

      PS: Hint

      $2 is undef