automate tuple creation

forkit forkit at gmail.com
Thu Jan 20 05:25:22 UTC 2022


On Thursday, 20 January 2022 at 04:38:39 UTC, forkit wrote:
>

all done ;-)

// ---

module test;

import std.stdio : writeln;
import std.range : iota, isForwardRange, hasSlicing, hasLength, 
isInfinite;
import std.array : array, Appender;
import std.random : Random, unpredictableSeed, dice, choice;
import std.algorithm : map, uniq, canFind;

@safe:

Random rnd;

static this()
{
   rnd = Random(unpredictableSeed);
}

void main()
{
     int recordsNeeded = 2;
     int boolValuesNeeded = 3;

     uint[] uniqueIDs;
     makeUniqueIDs(uniqueIDs, recordsNeeded);

     uint[][] tuples;
     createBoolMatrix(tuples, recordsNeeded, boolValuesNeeded);

     uint[][uint][] records = CreateTupleDictionary(uniqueIDs, 
tuples);
     processRecords(records);

}

auto CreateTupleDictionary(ref uint[] ids, ref uint[][] tuples)
{
     uint[][uint][] records;

     foreach(i, id; ids)
         records ~= [ ids[i] : tuples[i] ];

     return records.dup;
}

void processRecords(T)(const ref T t) if (isForwardRange!T && 
hasSlicing!T && hasLength!T && !isInfinite!T)
{
     t.writeln;

     // output from above should look like this:
     // [[999583661:[1, 1, 0]], [999273256:[1, 1, 1]]]

     // hoping to explore parallel here too...
}

void createBoolMatrix(ref uint[][] m, size_t numberOfTuples, 
size_t numberOfBoolsInTuple)
{
     m = iota(numberOfTuples)
             .map!(i => iota(numberOfBoolsInTuple)
             .map!(numberOfBoolsInTuple => cast(uint) 
rnd.dice(0.6, 1.4))
             .array).array;
}


void makeUniqueIDs(ref uint[] arr, size_t sz)
{
     arr.reserve(sz);

     // id needs to be 9 digits, and needs to start with 999
     int[] a = iota(999_000_000, 1_000_000_000).array;
     // above will contain 1_000_000 records that we can choose 
from.

     int i = 0;
     uint x;
     while(i != sz)
     {
        x = cast(uint)a.choice(rnd);

        // ensure every id added is unique.
        if (!arr.canFind(x))
        {
            arr ~= x;
            i++;
        }
     }
}

// ---



More information about the Digitalmars-d-learn mailing list