Array permutations

Elmar chrehme at gmx.de
Thu Sep 16 19:55:42 UTC 2021


On Saturday, 11 September 2021 at 19:37:42 UTC, Vino wrote:
> Hi All,
>
>    Request your help on the below to print the below array as 
> "Required output", Was able to get these values 
> "[1,2],[2,3],[3,4],[4,5]" by using list.slide(2), need your 
> help to get values "1,3],[1,4],[1,5],[2,4],[2,5],[3,5]"
>
> auto list[] = [1,2,3,4,5]
>
> Required output
> [1,2],[2,3],[3,4],[4,5],[1,3],[1,4],[1,5],[2,4],[2,5],[3,5]
>
> From,
> Vino

Would this be a valid solution to your problem?

```D
pure @safe nothrow
T[][] computeChoices(T)(T[] values, size_t tupleSize = 2)
{
     if (tupleSize == 0) {
      	return [[]];
     }

     T[][] choices = [];
     tupleSize--;
     foreach(i, element; values[0 .. $ - tupleSize])
     {
         import std.algorithm.iteration : map;
         import std.array : array;
         choices ~= computeChoices(values[i+1 .. $], tupleSize)
             		.map!(choice => element ~ choice)
             		.array;
     }

     return choices;
}

unittest
{
     assert(computeChoices([1, 2, 3, 4, 5], 2)
            	== [[1,2], [1,3], [1,4], [1,5], [2,3], [2,4], [2,5], 
[3,4], [3,5], [4,5]] );
}
```

You can choose in the 2nd parameter how large the inner arrays 
should be. It uses GC to allocate the result via the function 
`array`. If that is a problem, you could choose an allocator from 
`std.experimental.allocator` and use the `makeArray` function 
with the allocator instead of the `array` function. (Manual 
deallocation could be required then as well.)


More information about the Digitalmars-d-learn mailing list