Zeichen Zählen - Hommage an Andy und Autobert

  • Ich habe nicht so recht eine Idee in welchem Forum ich diesen Beitrag veröffentlichen soll - also vielleicht unter Hilfe?
    Die Fragestellung: Wie zähle ich am schnellsten wieoft ein bekanntes Zeichen in einem String unbekannter Länge und Inhalt vorkommt - kann man verschiedentlich lösen.
    Die Lösung, die ich hier im Forum von Andy gefunden habe ist aber schon extrem Beeindruckend simpel. So Simpel, dass man diesen Ansatz doch in die Hilfe übernehmen sollte.

    • stringreplace("aaaabbbbaaaaaccccaaaaa","a","a")
    • msgbox(0,0,"anzahl a´s :"&@extended)

    Zeichen zählen


    @ Andy und Autobert - ich ziehe meinen Hut!
    Es gibt hier im Forum haufenweise super Lösungen - diese finde ich beonders gelungen. Eine vorhandene Funktion via Fehlerauswertung zur Lösung zu bewegen :klatschen:

    Das muss einfach mal gesagt werden

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Die wohl schnellste Variante wäre wohl mit FASM und Inline-ASM-Code

    Wobei ich neulich interessehalber mal nachgeschaut hatte, wieso ein C(++)-Code für eine ähnliche Anwendung ca. 4-5x schneller als mein (zugegebenermaßen hingerotzter) 15-Zeilen ASM-Code war....
    Compilerflag -AVX2 gesetzt und mal eben 32 Bytes in ein YMM-Register geschaufelt und das mit EINEM Takt verglichen/ausgewertet.
    Und ich dagegen hab mit X86-ASM "gemütlich" ein Byte nach dem anderen ausgewertet. :thumbdown:

    Der vom C++-Compiler erzeugte AVX- ASM-Code war nicht mal sonderlich gut, handoptimiert wäre sicher noch mehr drin gewesen, aber 5x schneller und das nur mit einem Häkchen an der richtigen Stelle hat was

    Na gut, AVX2 läuft mit Sicherheit nicht mal auf 10% der vorhandenen Rechner, macht aber nix, sag ich dem C++-Compiler einfach, dass er nur SSE nehmen soll, wenn wenigstens das vorhanden ist....Wird das Programm halt 10KB größer, wen juckt das?

    Da lob ich mir AutoIt! Einzeiler, Geschwindigkeit ausreichend, passt! :thumbup:

  • Also schnell oder nicht schnell - mich begeistert die Idee (mit kindlicher Freude) eine vorhandene Funktion zu nehmen - und diese so zu mißhandeln - dass die Funktion nicht macht wozu sie da ist - aber ein Ergebnis liefert - für das es eigentlich keine eingebaute Funktion gibt - ich finds einach nur nett :)

    Ich benutze die Suche übrigens nur um \ in Dateinamen mit Pfaden zu finden und damit eine "Ordnertiefe" festzulegen. Und da funktioniert es wunschgemäß.
    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Vielleicht möchte ja jemand einen Kontest daraus machen.
    Ich werfe mal meine 08/15 Methode dahin...

    AutoIt
    MsgBox(0,"",UBound(StringRegExp("aaaabbbbaaaaaccccaaaaa", "a",3)))

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Eine vorhandene Funktion via Fehlerauswertung zur Lösung zu bewegen

    @extended hat eigentlich nichts mit Fehlerauswertung zu tun sondern gibt Zusatzinformationen aus.
    Die Anzahl der Ersetzungen wurde unter Anderem genau für solche Zwecke auf @extended ausgegeben.
    Da wird also nichts für andere Zwecke missbraucht sondern genau dafür genutzt wofür es vorgesehen war.

    Wenn du wirklich nur kleine "a"'s finden willst dann kannst du die Geschwindigkeit etwa verdoppeln in dem du als 4. Parameter von StringReplace 1 (Case-Sensitive-Option) setzt.

    @Schnuffel
    Ist bei mir nicht schneller:

    Spoiler anzeigen


    Wenn aber die Suchstrings komplexer (und vor allem länger) werden ist RegEx dann irgendwann schneller.

  • @AspirinJunkie
    wenn sich das mit @extended so verhällt wie Du schreibst, sollte man in den Hilfefunktionen explizit darauf hinweisen. Mir ist das, und sicher vielen anderen auch, in keiner Form bewußt gewesen. Daturch ergibt sich ja eine "erweiterte" Funktion - deren Beschrreibung, eigentlich, nicht existiert.

    Anyway - ich werde mehr Auge auf extended haben...

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Was meinst du mit "Hilfefunktionen"?
    Die Beschreibung existiert natürlich.
    Allgemein bei den >>Makros<< und speziell dieser Fall steht natürlich in der Hilfe zu >>StringReplace<<.

    Wenn man aufmerksam die Hilfe liest, stellt man fest, dass eine Vielzahl von Funktionen @extended für zusätzliche Informationen nutzen.
    InetRead z.B. für die Anzahl der übertragenen Bytes, Processwaitclose für den Exit-Code des Prozesses, StringRegExp für die aktuelle Position im String usw.
    Steht alles bereits in der Hilfe.

  • Auszug aus der Hilfe - Example zu "StringReplace()":

    AutoIt
    Local $text = StringReplace("this is a line of text", " ", "-")
    Local $numreplacements = @extended
    MsgBox(0, "New string is", $text)
    MsgBox(0, "The number of replacements done was", $numreplacements)

    €dit: Ich wussts anfangs auch nicht, aber fragen kostet ja nix - trotzdem steht es da wirklich ;)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.