You can also get tup2
from tup1
using:
ClearAll[fA]
fA = Union[Sort[{#, #[[{4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9}]]}] & /@ #][[All, 1]] &;
tup2A = fA @ tup1; // AbsoluteTiming // First
0.213222
Length @ tup2A
52650
ClearAll[fB]
fB = DeleteDuplicates[
Sort[{#, #[[{4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9}]]}] & /@ #][[All, 1]] &;
tup2B = fB @ tup1; // AbsoluteTiming // First
0.257217
ClearAll[fC]
fC = GroupOrbits[PermutationGroup[{{4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9}}], #,
Permute][[All, 1]] &
tup2C = fC @ tup1; // AbsoluteTiming // First
0.640413
4. Memoization
ClearAll[fD]
fD = Module[{f0},
f0[x_] := (f0[x] = f0[x[[{4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9}]]] = Sequence[]; x);
f0 /@ #] &;
tup2D = fD @ tup1; // AbsoluteTiming // First
0.794055
ClearAll[fE]
fE = DeleteDuplicatesBy[Sort[{#, #[[{4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9}]]}]&]
tup2E = fE @ tup1; // AbsoluteTiming // First
1.13389
ClearAll[fF]
fF = Values @ GroupBy[#,
Sort[{#, #[[{4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9}]]}] &,
First] &;
tup2F = fF @ tup1; // AbsoluteTiming // First
1.28655
All six results match tup2b
from WReach's answer:
tup2b == tup2A == tup2B == tup2C == tup2D == tup2E == tup2F
True
In comparison, tup2b
takes about a second:
tup2b = Module[{keep},
keep[t_] := (keep[t] = False;
keep[t[[{4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9}]]] = False;
True); Select[tup1, keep]]; // AbsoluteTiming // First
1.06063