Thread overview
Grabbing a subset of a range if a particular value is found?
Sep 24, 2013
Gary Willoughby
Sep 24, 2013
Ali Çehreli
Sep 24, 2013
Gary Willoughby
Sep 24, 2013
Ali Çehreli
September 24, 2013
I'm using std.range.recurrence to generate a range but i want to stop it generating and grab the range when a particular value is added. e.g.:

    recurrence!("a[n-1] + a[n-2]")(1, 2)
    .take(10)
    .writeln;

This writes ten numbers to the command line which is fair enough but what would be the preferred method to keep building the range until an element calculated is above a particular value.
September 24, 2013
On 09/24/2013 01:48 PM, Gary Willoughby wrote:> I'm using std.range.recurrence to generate a range but i want to stop it
> generating and grab the range when a particular value is added. e.g.:
>
>      recurrence!("a[n-1] + a[n-2]")(1, 2)
>      .take(10)
>      .writeln;
>
> This writes ten numbers to the command line which is fair enough but
> what would be the preferred method to keep building the range until

You said it: until. ;)

  http://dlang.org/phobos/std_algorithm.html#until

> an
> element calculated is above a particular value.

Ali

September 24, 2013
On Tuesday, 24 September 2013 at 20:54:30 UTC, Ali Çehreli wrote:
> On 09/24/2013 01:48 PM, Gary Willoughby wrote:> I'm using std.range.recurrence to generate a range but i want to stop it
> > generating and grab the range when a particular value is
> added. e.g.:
> >
> >      recurrence!("a[n-1] + a[n-2]")(1, 2)
> >      .take(10)
> >      .writeln;
> >
> > This writes ten numbers to the command line which is fair
> enough but
> > what would be the preferred method to keep building the range
> until
>
> You said it: until. ;)
>
>   http://dlang.org/phobos/std_algorithm.html#until
>
> > an
> > element calculated is above a particular value.
>
> Ali

Ha! Awesome, thanks!

I'm going to sit down a read the Phobos documentation in its entirety one day so i can get a handle on what is available.

I've just started the project euler problems and i'm loving exploring the range and algorithm libraries. This is a solution to one of the problems.

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

/**
 * Each new term in the Fibonacci sequence is generated by adding the previous
 * two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5,
 * 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci
 * sequence whose values do not exceed four million, find the sum of the
 * even-valued terms.
 */
void main()
{
	recurrence!("a[n-1] + a[n-2]")(1, 2)
		.until!("a > 4_000_000")
		.filter!(a => a % 2 == 0)
		.reduce!("a + b")
		.writeln;
}

I love chaining stuff up like this, it makes the solution easy to understand and read. As Walter said in one of his talks, the code looks like the problem being solved. I'm loving it! :)
September 24, 2013
On 09/24/2013 02:10 PM, Gary Willoughby wrote:

> import std.algorithm;
> import std.range;
> import std.stdio;
>
> /**
>   * Each new term in the Fibonacci sequence is generated by adding the
> previous
>   * two terms. By starting with 1 and 2, the first 10 terms will be: 1,
> 2, 3, 5,
>   * 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci
>   * sequence whose values do not exceed four million, find the sum of the
>   * even-valued terms.
>   */
> void main()
> {
>      recurrence!("a[n-1] + a[n-2]")(1, 2)
>          .until!("a > 4_000_000")
>          .filter!(a => a % 2 == 0)
>          .reduce!("a + b")
>          .writeln;
> }
>
> I love chaining stuff up like this, it makes the solution easy to
> understand and read. As Walter said in one of his talks, the code looks
> like the problem being solved. I'm loving it! :)

Awesome! :) And if you want to stick with non-string functions:

    recurrence!((a, n) => a[n-1] + a[n-2])(1, 2)
        .until!(a => a > 4_000_000)
        .filter!(a => a % 2 == 0)
        .reduce!((sum, a) => sum + a)
        .writeln;

Ali