algorithm's .filter!() by range key

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Feb 9 17:25:03 PST 2016


On 02/09/2016 12:54 PM, Charles wrote:
> On Tuesday, 9 February 2016 at 20:48:01 UTC, Steven Schveighoffer wrote:
>> On 2/9/16 3:40 PM, Charles wrote:
>>> This seems to be true of any range function really... is there a way to
>>> access the key within my range?
>>>
>>> Example of what I want to do:
>>>
>>> auto x = [1,2,3,4,5];
>>> x.filter( x_key % 2 == 1 ).sum(); // sum odd elements in array
>>
>> An array is not an indexed range. It only works with foreach by key
>> because of special foreach behavior.
>>
>> What you want is std.range.enumerate
>
>
> Exactly! Thanks!
>
> Interestingly, hackerrank doesn't seem to have it. They're using
> 2.067.0-b1 on Ubuntu 14.04.
>

For this specific problem, you can combine drop() and stride() (and even 
sum()! ;) ):

import std.range;
import std.algorithm;
import std.stdio;

void main()
{
     auto x = [1, 2, 3, 4, 5];
     writeln(x.drop(1).stride(2).sum); // 6
}

Ali



More information about the Digitalmars-d-learn mailing list