help on cartesianProduct()
Orut via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Dec 12 06:27:07 PST 2016
On Sunday, 11 December 2016 at 23:07:16 UTC, Era Scarecrow wrote:
> On Sunday, 11 December 2016 at 18:05:19 UTC, Era Scarecrow
> wrote:
>> On Sunday, 11 December 2016 at 16:34:38 UTC, Orut wrote:
>>> I need to be able to vary the number of ranges to feed into
>>> cartesianProduct() at run time.
>>
>> Hmmm... what kind of ranges? Are they going to be arrays? Or
>> something else?
>
>
> Well, with the assumption of using arrays (since you kinda need
> a length for it to work) I've thrown together a quick struct
> that does the job. Not fully tested, but will do the same thing
> with a varying number of inputs.
>
> [code]
> struct MultiCart(T) {
> T[][] data;
> int iteration;
> int max;
>
> this(T[][] _d, int iter=0) {
> data = _d;
> iteration = iter;
>
> max = 1;
> foreach(a; _d) {
> if (a.length)
> max *= a.length;
> }
> }
>
> T[] front() {
> int i = iteration;
> T[] val;
>
> foreach(d; data) {
> if (d.length) {
> val ~= d[i % d.length];
> i /= d.length;
> }
> }
>
> return val;
> }
>
> void popFront() {
> iteration++;
> }
>
> bool empty() {
> return iteration >= max;
> }
> }
>
> unittest {
> import std.stdio;
> alias CartInt = MultiCart!int;
>
> int[] a=[1,2,3],b=[4,5],c=[6,7];
> foreach(x; CartInt([a,b,c]))
> writeln(x);
>
> foreach(x; CartInt([a,b]))
> writeln(x);
> }
> [/code]
The code works beautifully! Thank you very much. Will certainly
acknowledge you as source of this code if this becomes of part of
a bigger project. I hope others searching this forum would also
discover this code.
More information about the Digitalmars-d-learn
mailing list