Advertisement
Janilabo

Combinations by slacky

Nov 3rd, 2013
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.85 KB | None | 0 0
  1. {$loadlib pumbaa.dll}
  2.  
  3. {*
  4. Combinations of size `seq` from given TIA `arr`.
  5. *}
  6. function TIACombinationsNew(arr: TIntegerArray; sequence: Integer): T2DIntegerArray;
  7. var
  8.   n, h, i, j: Integer;
  9.   o: TIntegerArray;
  10.   b: Boolean;
  11. begin
  12.   n := Length(arr);
  13.   if (sequence < n) then
  14.   begin
  15.     SetLength(o, sequence);
  16.     for i := 0 to (sequence - 1) do
  17.       o[i] := i;
  18.     SetLength(Result, 1, sequence);
  19.     for i := 0 to (sequence - 1) do
  20.       Result[0][i] := arr[i];
  21.     repeat
  22.       for i := (sequence - 1) downto 0 do
  23.       begin
  24.         b := not (o[i] <> (i + n - sequence));
  25.         if not b then
  26.         begin
  27.           o[i] := (o[i] + 1);
  28.           for j := (i + 1) to (sequence - 1) do
  29.             o[j] := (o[(j - 1)] + 1);
  30.           h := Length(Result);
  31.           SetLength(Result, (h + 1));
  32.           SetLength(Result[h], sequence);
  33.           for j := 0 to (sequence - 1) do
  34.             Result[h][j] := arr[o[j]];
  35.           Break;
  36.         end;
  37.       end;
  38.     until b;
  39.   end else
  40.     if (n > 0) then
  41.     begin
  42.       SetLength(Result, 1);
  43.       SetLength(Result[0], n);
  44.       for i := 0 to (n - 1) do
  45.         Result[0][i] := arr[i];
  46.     end else
  47.       SetLength(Result, 0);
  48. end;
  49.  
  50. function TIACombinationsOld(arr: TIntegerArray; sequence: Integer): T2DIntegerArray;
  51. var
  52.   n, h, i, j: Integer;
  53.   o: TIntegerArray;
  54.   b: Boolean;
  55. begin
  56.   n := Length(arr);
  57.   if (sequence < n) then
  58.   begin
  59.     SetLength(o, sequence);
  60.     for i := 0 to (sequence - 1) do
  61.       o[i] := i;
  62.     SetLength(Result, 1, sequence);
  63.     for i := 0 to (sequence - 1) do
  64.       Result[0][i] := arr[i];
  65.     repeat
  66.       b := True;
  67.       for i := (sequence - 1) downto 0 do
  68.       begin
  69.         b := not (o[i] <> (i + n - sequence));
  70.         if not b then
  71.           Break;
  72.       end;
  73.       if b then
  74.         Exit;
  75.       o[i] := (o[i] + 1);
  76.       for j := (i + 1) to (sequence - 1) do
  77.         o[j] := (o[(j - 1)] + 1);
  78.       h := Length(Result);
  79.       SetLength(Result, (h + 1));
  80.       SetLength(Result[h], sequence);
  81.       for i := 0 to (sequence - 1) do
  82.         Result[h][i] := arr[o[i]];
  83.     until False;
  84.   end else
  85.     if (n > 0) then
  86.     begin
  87.       SetLength(Result, 1);
  88.       SetLength(Result[0], n);
  89.       for i := 0 to (n - 1) do
  90.         Result[0][i] := arr[i];
  91.     end else
  92.       SetLength(Result, 0);
  93. end;
  94.  
  95. function TIACombinations(const Arr:TIntegerArray; Seq:Integer): T2DIntegerArray;
  96. var
  97.   n,h,i,j: Integer;
  98.   indices: TIntegerArray;
  99.   breakout: Boolean;
  100. begin
  101.   n := Length(arr);
  102.   if seq > n then Exit;
  103.   SetLength(indices, seq);
  104.   for i:=0 to (seq-1) do indices[i] := i;
  105.   SetLength(Result, 1, Seq);
  106.   for i:=0 to (seq-1) do Result[0][i] := arr[i];
  107.   while True do
  108.   begin
  109.     breakout := True;
  110.     for i:=(Seq-1) downto 0 do
  111.       if (indices[i] <> (i + n - Seq)) then begin
  112.         breakout := False;
  113.         Break;
  114.       end;
  115.     if breakout then Exit;
  116.     Indices[i] := Indices[i]+1;
  117.     for j:=i+1 to Seq-1 do
  118.       Indices[j] := (Indices[j-1] + 1);
  119.     h := Length(Result);
  120.     SetLength(Result, h+1);
  121.     SetLength(Result[h], Seq);
  122.     for i:=0 to Seq-1 do
  123.       Result[h][i] := Arr[Indices[i]];
  124.   end;
  125.   SetLength(Indices, 0);
  126. end;
  127.  
  128. var
  129.   TIA: TIntegerArray;
  130.   ATIA: T2DIntegerArray;
  131.   i: Integer;
  132.  
  133. begin
  134.   ClearDebug;
  135.   pp_TIAByRangeWrap(-100, 100, TIA);
  136.   i := GetSystemTime;
  137.   ATIA := TIACombinationsNew(TIA, 3);
  138.   WriteLn('NEW Calculated ' +ToStr(Length(ATIA))+ ' groups in ' + ToStr(GetSystemTime - i) + 'ms');
  139.   SetLength(ATIA, 0);
  140.   i := GetSystemTime;
  141.   ATIA := TIACombinationsOld(TIA, 3);
  142.   WriteLn('OLD Calculated ' +ToStr(Length(ATIA))+ ' groups in ' + ToStr(GetSystemTime - i) + 'ms');
  143.   SetLength(ATIA, 0);
  144.   i := GetSystemTime;
  145.   ATIA := TIACombinations(TIA, 3);
  146.   WriteLn('ORI Calculated ' +ToStr(Length(ATIA))+ ' groups in ' + ToStr(GetSystemTime - i) + 'ms');
  147.   SetLength(ATIA, 0);
  148. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement