Mathematica 120 130
Bearbeiten
Diese Version funktioniert mit Arrays unterschiedlicher Größe.
l = List;
g = Grid@Cases[Outer[l, Sequence @@ MapIndexed[l, #, {2}], 1]~Flatten~(Length[#] - 1),
x_ /; LessEqual @@ x[[All, 1]] == True :> x[[All, 2, 2]] - 1] &
Verwendungszweck
g@{{10, 20, 30}, {1, 22, 3}}
g@{{1, 5, 7, 10}, {2, 6, 6, 8, 12}, {4, 5, 9}}
g@{{10, 20, 30}, {1, 2, 3}}
g@{{1, -2, 3}, {-12, -7, 8, 9, 6}, {3, 99, 9}, {100, 10, -23}, {90, 10}}
Erläuterung
Verwenden Sie das erste Beispiel von oben,
a = {{10, 20, 30}, {1, 22, 3}}
MapIndexed
Legt Indizes für alle Elemente fest. NB: Mathematica beginnt mit 1 zu zählen. (Wir werden das später berücksichtigen.)
MapIndexed[l, a, {2}]
{{{10, {1, 1}}, {20, {1, 2}}, {30, {1, 3}}, {{1, {2, 1}}, {22, {2, 2}}, {3, {2, 3}}}}
Outer
generiert alle Listen, jeweils einen Kandidaten als Sandwich-Array, und die Indizes ihrer Elemente; %
enthält die Ergebnisse der vorherigen Ausgabe. Die Zahlen, 10
und 22
die I markiert , nachdem sie Ausgang waren, beziehen sich auf eine Sandwich - Anordnung , {10,22}
die noch als solche zu identifizieren hat.
Outer[l, Sequence @@ %, 1]~Flatten~(Length[a] - 1)
{{{10, {1, 1}}, {1, {2, 1}}, {{ 10 , {1, 1}}, { 22 , {2, 2}}, {{10, { 1, 1}}, {3, {2, 3}}}, {{20, {1, 2}}, {1, {2, 1}}, {{20, {1, 2}}, {22, {2, 2}}, {{20, {1, 2}}, {3, {2, 3}}, {{30, {1, 3}}, {1, {2, 1}}}, {{30, {1, 3}}, {22, {2, 2}}, {{30, {1, 3}}, {3, {2, 3}}}
Cases
testet jedes der oben genannten Elemente, um festzustellen, ob eine LessEqual
Beziehung (kleiner oder gleich) gilt. Die unten gezeigten Ergebnisse sind diejenigen Fälle, in denen Array-Sandwiches erkannt wurden. Ich habe noch einmal {10,22}
in der Ausgabe hervorgehoben.
Cases[%, x_ /; LessEqual @@ x[[All, 1]] == True]
{{{ 10 , {1, 1}}, { 22 , {2, 2}}, {{20, {1, 2}}, {22, {2, 2}}}
%%
bezieht sich auf die vorletzten Ergebnisse. :>
, [RuleDelayed] gibt diese Teile der interessierenden Instanzen zurück, nämlich die Indizes der Array-Sandwiches. -1
korrigiert die Tatsache, dass Mathematica Arrays mit 1 anstelle von 0 beginnt.
Cases[%%,
x_ /; LessEqual @@ x [[All, 1]] == True:> x [[All, 2, 2]] - 1]
{{0, 1}, {1, 1}}
Grid
zeigt die Ergebnisse in einem Raster an. Die erste Zeile 0 1
bedeutet, dass das Element 0 aus der ersten Unterliste (dh 10 ) und das Element 1 aus der zweiten Unterliste (dh 22 ) das erste gefundene Sandwich-Array bilden.
Grid@%
0 1
1 1