www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - simple range question

reply Laeeth Isharc <spamnolaeeth nospamlaeeth.com> writes:
suppose I have a forward or random access range.  what's the best 
way to compare each element with the element 4 elements prior to 
that element?  I could map each element to a tuple of the element 
and the element 4 bars previously and do it that way.  any neater 
way ?
Apr 08 2016
next sibling parent Jonathan M Davis via Digitalmars-d-learn writes:
On Friday, April 08, 2016 18:27:59 Laeeth Isharc via Digitalmars-d-learn 
wrote:
 suppose I have a forward or random access range.  what's the best
 way to compare each element with the element 4 elements prior to
 that element?  I could map each element to a tuple of the element
 and the element 4 bars previously and do it that way.  any neater
 way ?
Well, if you have a random access range, you can just use indices and loop over, making it so that one is getting i - 4 and the other is getting i for its element. Or if you don't have random access, you could just pop 4 elements off the front of one and then use equal to compare the ranges (and of course compare copies gotten via save if you don't want to actually consume those elements). e.g. something like auto result = range1.save.drop(4).equal(range2.save); Though of course, the lengths of the ranges have to match up appropriately for that. Slicing and then comparing with equal might be a good choice too. But without having more specifics on what exactly you're doing, it's kind of hard to give a much better suggestion. - Jonathan M Davis
Apr 08 2016
prev sibling next sibling parent jmh530 <john.michael.hall gmail.com> writes:
On Friday, 8 April 2016 at 18:27:59 UTC, Laeeth Isharc wrote:
 suppose I have a forward or random access range.  what's the 
 best way to compare each element with the element 4 elements 
 prior to that element?  I could map each element to a tuple of 
 the element and the element 4 bars previously and do it that 
 way.  any neater way ?
I would recommend writing a good lag function. If we have a good lag function, then you could easily do something like x.zip(x.lag(lookback)).map!(a => a[0] > a[1]); I could think of a few different ways to implement a lag function, but it would take some time to write a good one (including NA padding, for instance). You could probably use popBackN or popFrontN/drop to accomplish it, depending on forward or backward lags. Alternately, you could probably figure something out with .save that avoids the use of a lag function. You could create a range that saves up to four values. When full you pop off the front, make your comparison, and then save the latest.
Apr 08 2016
prev sibling parent Edwin van Leeuwen <edder tkwsping.nl> writes:
On Friday, 8 April 2016 at 18:27:59 UTC, Laeeth Isharc wrote:
 suppose I have a forward or random access range.  what's the 
 best way to compare each element with the element 4 elements 
 prior to that element?  I could map each element to a tuple of 
 the element and the element 4 bars previously and do it that 
 way.  any neater way ?
I'd do it like this, but I guess that is what you mean with mapping it to a tuple: zip( r, r[4..$] ).map!((t) => t[0] == t[1]);
Apr 08 2016