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.