alle Möglichkeiten der Zeichenreihenfolge eines Strings

  • Hallo,
    Wie schaffe ich es, dass alle Möglichkeiten der Reihenfolge eines Strings ausgegeben werden?
    Beispiel :
    String: "abcd"
    Ausgabe:
    abcd
    abdc
    acbd
    adbc
    acdb
    adcb
    bacd
    badc
    bdac
    bcad
    bcda
    bdca
    cabd
    cadb
    cbad
    cbda
    cdab
    cdba
    dabc
    dacb
    dbac
    dbca
    dcab
    dcba

    LG
    Schweizergeizer

  • @AspirinJunkie,
    DER war gut :thumbup:
    Ich stell mir gerade vor, wie jemand diese Funktion benutzt, um ein 8-stelliges Passwort zu "cracken", mit 90 erlaubten Zeichen.....in diesem Leben :rofl:

  • @Andy, Zeit ist doch relativ.

    Bei dem String "ABCDEFGHIJKLM" ist aber das ENDE erreicht und es kommt die Meldung:
    "T:\Program Files (x86)\AutoIt3\Include\Array.au3" (1319) : ==> Array maximum size exceeded.:
    ReDim $aResult[$iFactorial + 1]
    ReDim $aResult[^ ERROR

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Bei dem String "ABCDEFGHIJKLM" ist aber das ENDE erreicht


    Kein Wunder, unter der Vorraussetzung, dass jeder diese Buchstaben nur einmal verwendet wird, sind wir schon bei 13! also 6227020800 Kombinationen.

    Bei der von mir angesprochenen Variante von 8 Stellen mit je 90 Möglichkeiten sind das 37,6E12 (ob das stimmt ??? ) Kombinationen. Mal angenommen, man könnte die Permutation in einer Millisekunde berechnen und damit per Bruteforce versuchen ein Passwort zu knacken, würde das im ungünstigsten Fall 37,6E9 Sekunden, also 6,2E8 Stunden also 2,6E7 Tage also über den dicken Daumen 70000 (siebzigtausend) Jahre dauern...
    @Alina, hehe, Zeit ist relativ...selbst wenn ich mich irgendwo um Faktor 100 verrechnet habe :rofl:

  • Wir hatten vor geraumer Zeit mal eine optimierte Lösung für das Lösen von Anagrammen erstellt (über eine effektive Wörterbuchabfrage).
    Der Thread ist beim Servercrash im Sommer aber leider verloren gegangen.
    Wenn du mal ein Beispiel gibst, schreib ich es dir aber schnell neu.

    Der naive Ansatz über Permutationen führt eher nicht zum Ziel.

    Edit: O.k. hab mich mal rangesetzt:
    Benötigt wird: Eine Wörterbuchdatei (findet man im Netz oder >>hier<<)

    Grundidee: Man sortiere das Anagramm zeichenweise. Ist ein Wort eine Variation des Anagramms, dann ist dessen Sortierergebnis, das selbe wie beim Anagramm. Nun geht man eine Liste möglicher Wörter durch, sortiert diese jeweils zeichenweise und kann sie so mit dem Anagramm vergleichen.

    Nun zum Skript:

    Anagramm-Finder
    [autoit]

    ; Das Anagramm:
    Global $s_Anagramm = "lrahaso"

    [/autoit] [autoit][/autoit] [autoit]

    ; Wörterbuchdatei:
    Global Const $s_DicPath = "wörter.txt"

    [/autoit] [autoit][/autoit] [autoit]

    Global $s_Line, $s_Sorted
    Global $h_File = FileOpen($s_DicPath)
    If $h_File = -1 Then Exit MsgBox(48, "Fehler", "Konnte Wörterbuchdatei nicht öffnen")

    [/autoit] [autoit][/autoit] [autoit]

    ; Das Anagramm sortieren:
    Global Const $s_AnaSorted = CharSort($s_Anagramm)
    Global Const $s_AnaLen = StringLen($s_AnaSorted)

    [/autoit] [autoit][/autoit] [autoit]

    ; Wörterbuch durchgehen und auf Anagramm hin überprüfen:
    Do
    If StringLen($s_Line) = $s_AnaLen Then
    If $s_AnaSorted == CharSort($s_Line) Then MsgBox(0, "Fund", $s_Line)
    EndIf
    $s_Line = FileReadLine($h_File)
    Until @error
    FileClose($h_File)

    [/autoit] [autoit][/autoit] [autoit]

    ; sort the chars of a string with insertion-sort
    Func CharSort(ByRef $s_String)
    ; by AspirinJunkie
    Local $a_Chars = StringSplit($s_String, "", 2)
    Local $T1, $T2, $s_Ret = ""
    Local Const $n = UBound($a_Chars) - 1
    For $i = 0 To $n
    $T1 = $a_Chars[$i]
    For $j = $i - 1 To 0 Step -1
    $T2 = $a_Chars[$j]
    If $T1 >= $T2 Then ExitLoop
    $a_Chars[$j + 1] = $T2
    Next
    $a_Chars[$j + 1] = $T1
    Next
    For $i = 0 To $n
    $s_Ret &= $a_Chars[$i]
    Next
    Return $s_Ret
    EndFunc ;==>CharSort

    [/autoit]

    3 Mal editiert, zuletzt von AspirinJunkie (20. November 2014 um 14:27) aus folgendem Grund: Funktion Charsort etwas beschleunigt

  • AutoIt-Quellcode

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $s_String = "abcd"
    $a_String = StringSplit($s_String, "", 2)
    $a_Permutations = _ArrayPermute($a_String)
    _ArrayDisplay($a_Permutations)

    [/autoit]

    Das geht aber nur, wenn sich kein Buchstabe /Zahlt wiederholt.
    streiche: $s_String = "abcd"
    setze : $s_String = "abcb"

    Dabei kommen doppelte Kombinationen vor. Sollte man das nicht beachten, der der Frage, der vorkommenden Kombinatioen?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Dabei kommen doppelte Kombinationen vor. Sollte man das nicht beachten, der der Frage, der vorkommenden Kombinatioen?

    Daher haben wir ja gefragt welchen Anwendungsfall das Ganze haben soll.
    Und hierfür ist dieser Ansatz sowieso prinzipiell ungeeignet, weswegen ich ja noch eine Alternative gepostet habe.
    Wenn du es dennoch so machen willst musst du lediglich noch ein _ArrayUnique() hintendran hängen um deinen Fall mit beachten.

  • Interessant ist, welche Wörterbücher verwendet werden. Ich habe im jugendlichen Leichtsinn gedacht, in der deutschen Wikipedia würden so gut wie alle Wörter verwendet werden, aber das war ein Irrtum.
    Mittlerweile habe ich einen ganzen Pool von Wörterbüchern, in Englisch ist das Ganze noch viel schlimmer, da gibt es Wörterbücher nur mit Eigennamen, Ortschaften, Straßennamen uswusf. allein die Suche danach ist eine Sysiphosarbeit!
    Wer übrigens denkt, "Na dann mach doch aus den ganzen Wörterbüchern ein großes bzw. füttere damit eine Datenbank", der sollte sich mit dem Thema mal intensiv beschäftigen, VIEL Geld und vor allem Zeit und einen Haufen Mitarbeiter zur Verfügung haben und dann gegen rennomierte Institute in den Ring steigen :thumbup: