program ideone;
type
TBytes2D = array of array of Byte;
function NextPerm(var Data: array of Byte): Boolean;
var
i, j: Byte;
procedure Swap(var a, b: Byte);
var
t: Byte;
begin
t := a;
a := b;
b := t;
end;
begin
i := High(Data);
while (i > 0) and (Data[i - 1] >= Data[i]) do
Dec(i);
if (i <= 0) then
Exit(False);
j := High(Data);
while Data[j] <= Data[i - 1] do
Dec(j);
Swap(Data[i - 1], Data[j]);
j := High(Data);
while i < j do begin
Swap(Data[i], Data[j]);
Inc(i);
Dec(j)
end;
Exit(True);
end;
procedure PrintOut(const a: TBytes2D);
var
i, j: Integer;
begin
for i := 0 to High(a) do begin
Write('[');
for j := 0 to High(a[i]) do begin
Write(a[i, j]);
if j < High(a[i]) then
Write(', ');
end;
Write('] ');
end;
Writeln;
end;
//https://stackoverflow.com/questions/47376466/algorithm-for-permutation-with-buckets
procedure GenDistributions(N: Integer);
var
seq, t, i, j, mx: Integer;
Data: array of Byte;
Dist: TBytes2D;
begin
SetLength(Data, N);
//there are n-1 places for incrementing
//so 2^(n-1) possible sequences
for seq := 0 to 1 shl (N - 1) - 1 do begin
t := seq;
mx := 0;
Data[0] := mx;
for i := 1 to N - 1 do begin
mx := mx + (t and 1); //check for the lowest bit
Data[i] := mx;
t := t shr 1;
end;
//here Data contains nondecreasing sequqnce 0..mx, increment is 0 or 1
//Data[i] corresponds to the number of sublist which item i belongs to
repeat
Dist := nil;
SetLength(Dist, mx + 1); // reset result array
for i := 0 to N - 1 do begin
j := Length(Dist[Data[i]]);
SetLength(Dist[Data[i]], j+1);
Dist[Data[i]] [j] := i; //add item to calculated sublist
end;
PrintOut(Dist);
until not NextPerm(Data); //generates next permutation if possible
end;
end;
begin
GenDistributions(3);
end.
cHJvZ3JhbSBpZGVvbmU7Cgp0eXBlCiAgVEJ5dGVzMkQgPSBhcnJheSBvZiBhcnJheSBvZiBCeXRlOwoKICBmdW5jdGlvbiBOZXh0UGVybSh2YXIgRGF0YTogYXJyYXkgb2YgQnl0ZSk6IEJvb2xlYW47CiAgdmFyCiAgICBpLCBqOiBCeXRlOwoKICAgIHByb2NlZHVyZSBTd2FwKHZhciBhLCBiOiBCeXRlKTsKICAgIHZhcgogICAgICB0OiBCeXRlOwogICAgYmVnaW4KICAgICAgdCA6PSBhOwogICAgICBhIDo9IGI7CiAgICAgIGIgOj0gdDsKICAgIGVuZDsKCiAgYmVnaW4KICAgIGkgOj0gSGlnaChEYXRhKTsKICAgIHdoaWxlIChpID4gMCkgYW5kIChEYXRhW2kgLSAxXSA+PSBEYXRhW2ldKSBkbwogICAgICBEZWMoaSk7CgogICAgaWYgKGkgPD0gMCkgdGhlbgogICAgICBFeGl0KEZhbHNlKTsKCiAgICBqIDo9IEhpZ2goRGF0YSk7CiAgICB3aGlsZSBEYXRhW2pdIDw9IERhdGFbaSAtIDFdIGRvCiAgICAgIERlYyhqKTsKCiAgICBTd2FwKERhdGFbaSAtIDFdLCBEYXRhW2pdKTsKICAgIGogOj0gSGlnaChEYXRhKTsKICAgIHdoaWxlIGkgPCBqIGRvIGJlZ2luCiAgICAgIFN3YXAoRGF0YVtpXSwgRGF0YVtqXSk7CiAgICAgIEluYyhpKTsKICAgICAgRGVjKGopCiAgICBlbmQ7CiAgICBFeGl0KFRydWUpOwogIGVuZDsKCiAgcHJvY2VkdXJlIFByaW50T3V0KGNvbnN0IGE6IFRCeXRlczJEKTsKICB2YXIKICAgIGksIGo6IEludGVnZXI7CiAgYmVnaW4KICAgIGZvciBpIDo9IDAgdG8gSGlnaChhKSBkbyBiZWdpbgogICAgICBXcml0ZSgnWycpOwogICAgICBmb3IgaiA6PSAwIHRvIEhpZ2goYVtpXSkgZG8gYmVnaW4KICAgICAgICBXcml0ZShhW2ksIGpdKTsKICAgICAgICBpZiBqIDwgSGlnaChhW2ldKSB0aGVuIAogICAgICAgICAgV3JpdGUoJywgJyk7CiAgICAgIGVuZDsKICAgICAgV3JpdGUoJ10gJyk7CiAgICBlbmQ7CiAgICBXcml0ZWxuOwogIGVuZDsKCgogIC8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDczNzY0NjYvYWxnb3JpdGhtLWZvci1wZXJtdXRhdGlvbi13aXRoLWJ1Y2tldHMKICBwcm9jZWR1cmUgR2VuRGlzdHJpYnV0aW9ucyhOOiBJbnRlZ2VyKTsKICB2YXIKICAgIHNlcSwgdCwgaSwgaiwgbXg6IEludGVnZXI7CiAgICBEYXRhOiBhcnJheSBvZiBCeXRlOwogICAgRGlzdDogVEJ5dGVzMkQ7CiAgYmVnaW4KICAgIFNldExlbmd0aChEYXRhLCBOKTsKCiAgICAvL3RoZXJlIGFyZSBuLTEgcGxhY2VzIGZvciBpbmNyZW1lbnRpbmcKICAgIC8vc28gMl4obi0xKSBwb3NzaWJsZSBzZXF1ZW5jZXMKICAgIGZvciBzZXEgOj0gMCB0byAxIHNobCAoTiAtIDEpIC0gMSBkbyBiZWdpbgogICAgICB0IDo9IHNlcTsKICAgICAgbXggOj0gMDsKICAgICAgRGF0YVswXSA6PSBteDsKICAgICAgZm9yIGkgOj0gMSB0byBOIC0gMSBkbyBiZWdpbgogICAgICAgIG14IDo9IG14ICsgKHQgYW5kIDEpOyAvL2NoZWNrIGZvciB0aGUgbG93ZXN0IGJpdAogICAgICAgIERhdGFbaV0gOj0gbXg7CiAgICAgICAgdCA6PSB0IHNociAxOwogICAgICBlbmQ7CgogICAgICAvL2hlcmUgRGF0YSBjb250YWlucyBub25kZWNyZWFzaW5nIHNlcXVxbmNlIDAuLm14LCBpbmNyZW1lbnQgaXMgMCBvciAxCiAgICAgIC8vRGF0YVtpXSBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIHN1Ymxpc3Qgd2hpY2ggaXRlbSBpIGJlbG9uZ3MgdG8KCiAgICAgIHJlcGVhdAogICAgICAgIERpc3QgOj0gbmlsOwogICAgICAgIFNldExlbmd0aChEaXN0LCBteCArIDEpOyAvLyByZXNldCByZXN1bHQgYXJyYXkKCiAgICAgICAgZm9yIGkgOj0gMCB0byBOIC0gMSBkbyBiZWdpbgogICAgICAgICAgaiA6PSBMZW5ndGgoRGlzdFtEYXRhW2ldXSk7CiAgICAgICAgICBTZXRMZW5ndGgoRGlzdFtEYXRhW2ldXSwgaisxKTsKICAgICAgICAgIERpc3RbRGF0YVtpXV0gW2pdIDo9IGk7IC8vYWRkIGl0ZW0gdG8gY2FsY3VsYXRlZCBzdWJsaXN0CiAgICAgICAgZW5kOyAgCgogICAgICAgIFByaW50T3V0KERpc3QpOwogICAgICB1bnRpbCBub3QgTmV4dFBlcm0oRGF0YSk7ICAvL2dlbmVyYXRlcyBuZXh0IHBlcm11dGF0aW9uIGlmIHBvc3NpYmxlCgogICAgZW5kOwoKICBlbmQ7CgpiZWdpbgogIEdlbkRpc3RyaWJ1dGlvbnMoMyk7CmVuZC4=
[0, 1, 2]
[0] [1, 2]
[1] [0, 2]
[2] [0, 1]
[0, 1] [2]
[0, 2] [1]
[1, 2] [0]
[0] [1] [2]
[0] [2] [1]
[1] [0] [2]
[2] [0] [1]
[1] [2] [0]
[2] [1] [0]