Clever-Excel-Forum

Normale Version: [LAMBDA] PERMUT.LIST (Liste von Permutationen ohne oder mit Wdh.)
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
PERMUT.LIST sei der Name für

=LAMBDA(n;[wdh];LET(
x;TEXT(SEQUENZ(10^n-(10-n-1)*10^(n-1);;0);WIEDERHOLEN(0;n));
FILTER(x;NACHZEILE(x;LAMBDA(a;SUMME(n^TEIL(a;SEQUENZ(;n);1))=SUMME(n^SEQUENZ(;n))-wdh)))))


=PERMUT.LIST(6) ergibt die 720 Einträge fassende Liste
123456
123465
:::
654321

=PERMUT.LIST(6;6^2-6^1) erzeugt einen Wiederholer (statt der 2 noch eine 1) mit 360 Einträgen:
113456
113465
:::
654311

=PERMUT.LIST(6;6^2-6^1+6^3-6^1) erzeugt einen Dreier als Wiederholer (statt der 2 und der 3 noch je eine 1) mit 120 Einträgen:
111456
111465
:::
654111

=PERMUT.LIST(6;6^2-6^1+6^3-6^1+6^5-6^4) erzeugt einen Dreier und einen Zweier (statt der 2 und der 3 noch je eine 1 sowie statt der 5 noch eine 4) mit 60 Einträgen:
111446
111464
:::
644111

=PERMUT.LIST(6;6^2-6^1+6^3-6^1+6^5-6^4+6^6-6^4) erzeugt zwei Dreier (statt der 2 und der 3 noch je eine 1 sowie statt der 5 und der 6 noch je eine 4) mit 20 Einträgen:
111444
114144
:::
444111

Achtung: Nur Excel 365/XLWeb. Die Funktion braucht bei n=6 einige Sekunden. n kann 2 bis 6 betragen. Benötigt man n=8 (ohne Wdh.): Kombinatorik: Permutationen ohne Wiederholung auflisten * (lässt sich seit XL2007 auch auf n=9 erweitern).

Mit einem Trick erweitert man nun das n bis auf 9 (das Maximum ohne Wdh. in XL2007+):
Zeilen 1:2 bleiben hier noch leer.
B1:F2: bleibt noch leer
A3#: =PERMUT.LIST(5)
B3#: =LET(x;LÄNGE($A3)+SPALTE(A1);EINDEUTIG(SORTIEREN(WECHSELN(ZUSPALTE(ERSETZEN(A3#;SEQUENZ(;x;x;-1);0;x));B1;B2))))
und fülle das bis G3#: aus. Ab F3#: läge nun n>9 vor; Excel XL2007+ kann aber Permutationen nur bis zu n=9 darstellen; ab hier also korrekt als Fehler: #ZAHL!

"Mit Wdh." kann man nun auf n>9 gehen. Gedanke: Man kann die Listen auf jeder Zwischenstufe auch selbst mit Wiederholern ausstatten (über WECHSELN()). Und schon kann man noch höhere n permutieren! Die Formel in B3# ist schon damit ausgestattet.

Beispiel mit n=11 und darin einer 5er- und einer 4er-Wdh.:
B1#: ={1.7.8.9.10.11;2.2.2.4.4.5} sind die Wechsel-Parameter für das Folgende
A3#: =PERMUT.LIST(5;20+120+2500)
B3#[:G3#]: (Formel s. oben)
In diesem G3#: haben wir nun folgende 13860=FAKULTÄT(11)/FAKULTÄT(5)/FAKULTÄT(4) Einträge:
22222444456
22222444465
22222444546
:::
65444422222
Das schreit nach Rekursion. Noch mal alles auf "Anfang": Kein SORTIEREN, kein WECHSELN, also Wiederholer erst später.

A1#: =1 (Achtung: Das Gleichheitszeichen ist nötig, damit A1 als A1# angesprochen werden kann!)
B1#[:I1#]: =EINDEUTIG(ZUSPALTE(ERSETZEN(A1#;SEQUENZ(;LÄNGE(A1)+1);0;LINKS(A1)+1)))

ergibt in I1# die maximale 9er-Permutationsliste (und die 2er- bis 8er- auf dem Weg dorthin). Unsortiert.

Ich habe LÄNGE(A1)+1 und LINKS(A1)+1 genommen; es hätte jeweils auch SPALTE(B1) sein dürfen. Ich dachte mir, ich müsse irgendwie Vorsorge für Wdh. treffen.

Vielleicht kannst Du, maninweb (oder ein anderer?), ja die Rekursion vervollständigen? Ich bekomme es nicht hin, mein Gehirn überhitzt; bin kein Informatiker, der das einfach besser kann.

Toll wäre es, wenn =PERMUT_LIST(9) genau dieses ergäbe. Und mit einem Argument größer als 9 bzw. TEXT: =PERMUT_LIST("11111222234") das Ergebnis wie in #1.

Hier noch einmal der starre 9er-Fall über Einsetzen:
=
EINDEUTIG(ZUSPALTE(ERSETZEN(
EINDEUTIG(ZUSPALTE(ERSETZEN(
EINDEUTIG(ZUSPALTE(ERSETZEN(
EINDEUTIG(ZUSPALTE(ERSETZEN(
EINDEUTIG(ZUSPALTE(ERSETZEN(
EINDEUTIG(ZUSPALTE(ERSETZEN(
EINDEUTIG(ZUSPALTE(ERSETZEN(
EINDEUTIG(ZUSPALTE(ERSETZEN(
1;
SEQUENZ(;2);0;2)));
SEQUENZ(;3);0;3)));
SEQUENZ(;4);0;4)));
SEQUENZ(;5);0;5)));
SEQUENZ(;6);0;6)));
SEQUENZ(;7);0;7)));
SEQUENZ(;8);0;8)));
SEQUENZ(;9);0;9)))

EINDEUTIG kann hier übrigens alle 8x weg, weil - mangels Wiederholern - nichts dadurch bewirkt wird. Ist also nur auf Vorrat für Wiederholer genannt!
Mit =PERMUT_LIST(9) erhalte ich nun rekursiv die 362880 Einträge (unsortiert, ohne Wiederholer; EINDEUTIG darf raus, ca. 1/3 Sekunde Dauer):

PERMUT_LIST: =LAMBDA(n;ZUSPALTE(WENN(n<2;1;ERSETZEN(PERMUT_LIST(n-1);SEQUENZ(;n);0;n))))

Das ist schon mal ein großer Erfolg, auch für LAMBDA mit dieser extremen Kürze!

"String mit Wiederholern" hat nun auch geklappt:

Mit =P_RPT_LIST(111444) erhalte ich nun rekursiv die 20 Einträge (unsortiert, mit Wiederholern; EINDEUTIG ist essenziell, ca. 1/3 Sekunde Dauer):

P_RPT_LIST: =LAMBDA(n;LET(t;LÄNGE(n);r;RECHTS(n);EINDEUTIG(ZUSPALTE(WENN(t<2;r;ERSETZEN(P_RPT_LIST(LINKS(n;t-1));SEQUENZ(;t);0;r))))))

=SORTIEREN(P_RPT_LIST("1111444333333T")) ergibt 840.840 Einträge und dauert 5 Sekunden. Nicht zu vergessen: Alphanumerisch!