Cartesian product of two or more lists: Difference between revisions
Added Delphi example
MaiconSoft (talk | contribs) (Added Delphi example) |
|||
Line 1,001:
[[3, 1], [3, 2], [4, 1], [4, 2]]
[]
[]</pre>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{Trans|Go}}
<lang Delphi>
program Cartesian_product_of_two_or_more_lists;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
type
TList = TArray<Integer>;
TLists = TArray<TList>;
TListHelper = record helper for TList
function ToString: string;
end;
TListsHelper = record helper for TLists
function ToString(BreakLines: boolean = false): string;
end;
function cartN(arg: TLists): TLists;
var
b, n: TList;
argc: Integer;
begin
argc := length(arg);
var c := 1;
for var a in arg do
c := c * length(a);
if c = 0 then
exit;
SetLength(result, c);
SetLength(b, c * argc);
SetLength(n, argc);
var s := 0;
for var i := 0 to c - 1 do
begin
var e := s + argc;
var Resi := copy(b, s, e - s);
Result[i] := Resi;
s := e;
for var j := 0 to high(n) do
begin
var nj := n[j];
Resi[j] := arg[j, nj];
end;
for var j := high(n) downto 0 do
begin
inc(n[j]);
if n[j] < Length(arg[j]) then
Break;
n[j] := 0;
end;
end;
end;
{ TListHelper }
function TListHelper.ToString: string;
begin
Result := '[';
for var i := 0 to High(self) do
begin
Result := Result + self[i].ToString;
if i < High(self) then
Result := Result + ' ';
end;
Result := Result + ']';
end;
{ TListsHelper }
function TListsHelper.ToString(BreakLines: boolean = false): string;
begin
Result := '[';
for var i := 0 to High(self) do
begin
Result := Result + self[i].ToString;
if i < High(self) then
begin
if BreakLines then
Result := Result + #10
else
Result := Result + ' ';
end;
end;
Result := Result + ']';
end;
begin
writeln(#10, cartN([[1, 2], [3, 4]]).ToString);
writeln(#10, cartN([[3, 4], [1, 2]]).ToString);
writeln(#10, cartN([[1, 2], []]).ToString);
writeln(#10, cartN([[], [1, 2]]).ToString);
writeln(#10, cartN([[1776, 1789], [17, 12], [4, 14, 23], [0, 1]]).ToString(True));
writeln(#10, cartN([[1, 2, 3], [30], [500, 100]]).ToString);
writeln(#10, cartN([[1, 2, 3], [], [500, 100]]).ToString);
{$IFNDEF UNIX} readln; {$ENDIF}
end.</lang>
{{out}}
<pre>[[1 3] [1 4] [2 3] [2 4]]
[[3 1] [3 2] [4 1] [4 2]]
[]
[]
[[1776 17 4 0]
[1776 17 4 1]
[1776 17 14 0]
[1776 17 14 1]
[1776 17 23 0]
[1776 17 23 1]
[1776 12 4 0]
[1776 12 4 1]
[1776 12 14 0]
[1776 12 14 1]
[1776 12 23 0]
[1776 12 23 1]
[1789 17 4 0]
[1789 17 4 1]
[1789 17 14 0]
[1789 17 14 1]
[1789 17 23 0]
[1789 17 23 1]
[1789 12 4 0]
[1789 12 4 1]
[1789 12 14 0]
[1789 12 14 1]
[1789 12 23 0]
[1789 12 23 1]]
[[1 30 500] [1 30 100] [2 30 500] [2 30 100] [3 30 500] [3 30 100]]
[]</pre>
|