On Thursday, 2 August 2018 at 08:30:05 UTC, Greatsam4sure wrote:
I know D is very powerful from my little experience. What is the idiomatic way to get prime numbers say from 1-30 without using loops(outer and inner loop). Can map, filter, fold etc in algorithm be use. Pls show some code with chain call.

I can easily achieve even numberd and odd numbers using filter. But prime numbers I have to use 2loops.

I will appreciate any help,just a newbie in D

If you just want a small number of prime numbers and your goal is to make it a simple chain of range functions, I would do this:

```
import std.stdio: writeln;
import std.algorithm: filter, canFind;
import std.range: iota;

void main()
{
auto isPrime = (int number) => number >= 2 && !iota(2, number).canFind!(x => (number % x) == 0);
    writeln(iota(30).filter!isPrime);
}

```

You first make a simple prime filter, and then apply it to a range of integers 0 to 30 using `iota(30)`. I use lambda syntax for isPrime, but you can also make it an explicit function:
```
bool isPrime(int number) {
return number >= 2 && !iota(2, number).canFind!(x => (number % x) == 0);
}
```

`iota(2, number)` generates a range of integers from 2 to `number` (excluding `number` itself), and with canFind we can see if any of those divide our number. If so, then number isn't prime.

Note that if you're serious about calculating primes, you should look for an efficient algorithm. Even in this naive algorithm there are many optimization possibilities, like stopping the iota at sqrt(number), but it would make the range code more complicated.

Reply via email to