Jump to page: 1 2
Thread overview
[your code here]
Apr 27, 2021
Jeff Pratt
Apr 27, 2021
Paul Backus
Apr 28, 2021
drug
Apr 28, 2021
Paul Backus
Apr 28, 2021
drug
Apr 29, 2021
Timon Gehr
Apr 29, 2021
drug
Apr 29, 2021
Q. Schroll
Apr 29, 2021
Berni44
Apr 29, 2021
Dennis
Apr 29, 2021
WebFreak001
April 27, 2021
// Estimate π using random integers
void main()
{
    import std.stdio, std.random, std.math, std.conv;
    ulong gcd(ulong a, ulong b)
    {
        if (b == 0) return a;
        return gcd(b, a % b);
    }
    Mt19937_64 gen; gen.seed(unpredictableSeed!ulong);
    int pairCount = 1_000_000;
    int coprimeCount = 0;
    ulong a, b;
    for (int i = 0; i < pairCount; i++) {
        a = gen.front; gen.popFront();
        b = gen.front; gen.popFront();
        if (gcd(a, b) == 1) coprimeCount++;
    }
    double prob = coprimeCount.to!double / pairCount.to!double;
    writefln("π ≈ %.15f", sqrt(6.0 / prob));
}
April 27, 2021

On Tuesday, 27 April 2021 at 21:04:19 UTC, Jeff Pratt wrote:

>
// Estimate π using random integers
void main()
{
    import std.stdio, std.random, std.math, std.conv;
    ulong gcd(ulong a, ulong b)
    {
        if (b == 0) return a;
        return gcd(b, a % b);
    }
    Mt19937_64 gen; gen.seed(unpredictableSeed!ulong);
    int pairCount = 1_000_000;
    int coprimeCount = 0;
    ulong a, b;
    for (int i = 0; i < pairCount; i++) {
        a = gen.front; gen.popFront();
        b = gen.front; gen.popFront();
        if (gcd(a, b) == 1) coprimeCount++;
    }
    double prob = coprimeCount.to!double / pairCount.to!double;
    writefln("π ≈ %.15f", sqrt(6.0 / prob));
}

Nice example! A couple small improvements:

  • You can use std.numeric.gcd instead of writing your own.
  • You can use a foreach loop instead of a for loop.
// Estimate π using random integers
void main()
{
    import std.stdio, std.random, std.math, std.conv, std.numeric;
    Mt19937_64 gen; gen.seed(unpredictableSeed!ulong);
    int pairCount = 1_000_000;
    int coprimeCount = 0;
    ulong a, b;
    foreach (int i; 0 .. pairCount) {
        a = gen.front; gen.popFront();
        b = gen.front; gen.popFront();
        if (gcd(a, b) == 1) coprimeCount++;
    }
    double prob = coprimeCount.to!double / pairCount.to!double;
    writefln("π ≈ %.15f", sqrt(6.0 / prob));
}
April 28, 2021
28.04.2021 00:43, Paul Backus пишет:
> // Estimate π using random integers
> void main()
> {
>      import std.stdio, std.random, std.math, std.conv, std.numeric;
>      Mt19937_64 gen; gen.seed(unpredictableSeed!ulong);
>      int pairCount = 1_000_000;
>      int coprimeCount = 0;
>      ulong a, b;
>      foreach (int i; 0 .. pairCount) {
>          a = gen.front; gen.popFront();
>          b = gen.front; gen.popFront();
>          if (gcd(a, b) == 1) coprimeCount++;
>      }
>      double prob = coprimeCount.to!double / pairCount.to!double;
>      writefln("π ≈ %.15f", sqrt(6.0 / prob));
> }
Functional style
```D
// Estimate π using random integers
void main()
{
    import std.algorithm, std.stdio, std.random, std.math, std.conv, std.numeric, std.range;
    Mt19937_64 gen; gen.seed(unpredictableSeed!ulong);
    int pairCount = 1_000_000;
    double coprimeCount = zip(gen, gen.dropOne)
        .take(pairCount)
        .map!((a)=>(gcd(a[0], a[1]) == 1) ? 1 : 0)
        .sum(0);

    auto prob = coprimeCount / pairCount;
    writefln("π ≈ %.15f", sqrt(6.0 / prob));
}
```
April 28, 2021

On Wednesday, 28 April 2021 at 07:56:50 UTC, drug wrote:

>
        .map!((a)=>(gcd(a[0], a[1]) == 1) ? 1 : 0)
        .sum(0);

Alternatively:

.filter!(pair => gcd(pair[0], pair[1]) == 1)
.count;
April 28, 2021
28.04.2021 15:34, Paul Backus пишет:
> On Wednesday, 28 April 2021 at 07:56:50 UTC, drug wrote:
>> ```D
>>         .map!((a)=>(gcd(a[0], a[1]) == 1) ? 1 : 0)
>>         .sum(0);
>> ```
> 
> Alternatively:
> 
> ```d
> .filter!(pair => gcd(pair[0], pair[1]) == 1)
> .count;
> ```

it's better alternative!
April 29, 2021
On 28.04.21 15:21, drug wrote:
> 28.04.2021 15:34, Paul Backus пишет:
>> On Wednesday, 28 April 2021 at 07:56:50 UTC, drug wrote:
>>> ```D
>>>         .map!((a)=>(gcd(a[0], a[1]) == 1) ? 1 : 0)
>>>         .sum(0);
>>> ```
>>
>> Alternatively:
>>
>> ```d
>> .filter!(pair => gcd(pair[0], pair[1]) == 1)
>> .count;
>> ```
> 
> it's better alternative!


```d
.count!(pair => gcd(pair[0], pair[1]) == 1);
```
April 29, 2021
29.04.2021 15:26, Timon Gehr пишет:
> On 28.04.21 15:21, drug wrote:
>> 28.04.2021 15:34, Paul Backus пишет:
>>> On Wednesday, 28 April 2021 at 07:56:50 UTC, drug wrote:
>>>> ```D
>>>>         .map!((a)=>(gcd(a[0], a[1]) == 1) ? 1 : 0)
>>>>         .sum(0);
>>>> ```
>>>
>>> Alternatively:
>>>
>>> ```d
>>> .filter!(pair => gcd(pair[0], pair[1]) == 1)
>>> .count;
>>> ```
>>
>> it's better alternative!
> 
> 
> ```d
> .count!(pair => gcd(pair[0], pair[1]) == 1);
> ```

it's the best! :)
April 29, 2021

On Wednesday, 28 April 2021 at 12:34:51 UTC, Paul Backus wrote:

>

On Wednesday, 28 April 2021 at 07:56:50 UTC, drug wrote:

>
        .map!((a)=>(gcd(a[0], a[1]) == 1) ? 1 : 0)
        .sum(0);

Alternatively:

.filter!(pair => gcd(pair[0], pair[1]) == 1)
.count;
.filter!(pair => pair.expand.gcd == 1)

Not sure if it's trolly or more elegant.

April 29, 2021

On Thursday, 29 April 2021 at 14:33:06 UTC, Q. Schroll wrote:

>
.filter!(pair => pair.expand.gcd == 1)

Not sure if it's trolly or more elegant.

I fear that new users might already be swamped with functional style and won't understand what's going on here. (But nice anyway.)

April 29, 2021

On Thursday, 29 April 2021 at 15:53:43 UTC, Berni44 wrote:

>

I fear that new users might already be swamped with functional style and won't understand what's going on here. (But nice anyway.)

I think the range-based functional style of D is overrepresented.

When I first landed on the homepage, I saw the "Sort lines" example which scared me off. It looked totally unfamiliar, I thought D was more akin to Scala/Haskell than the Java/C-like languages I was most familiar with. Only later did I figure out that D really is a newer C/C++ like the name implies, and the range programming is just Phobos acting on top of it.

In all the examples, there is not a single if/do/while/for statement, not a single class or interface declaration, and only 1 struct declaration. I think it wouldn't hurt to have examples showing boring/traditional code in D syntax in addition to the fancy, 'code-golfy' programs.

« First   ‹ Prev
1 2