Beiträge von Oscar

    Das solltest du in deinem ersten Post und auch in dem Nim-Script vermerken.

    Ich hab's mal oben eingefügt. Danke!


    Passend zu diesem Thema ist evtl. auch dies hier: https://de.wikipedia.org/wiki/Hamming-Abstand

    Nicht ganz!

    Die Levenshtein-Distanz unterscheidet sich etwas vom Hamming-Abstand.

    Siehe hier: https://de.wikipedia.org/wiki/Levenshtein-Distanz

    Zitat


    Die Levenshtein-Distanz kann als Erweiterung des Hamming-Abstands angesehen werden, welcher sich auf Ersetzungen beschränkt und daher nur Zeichenketten gleicher Länge bemessen kann.

    Nochmal eine neue Version, weil ich bemerkte, dass die Nim-interne Funktion zum berechnen der Levenshtein-Distanz doch deutlich effektiver arbeitet.

    Diesen deutlichen Geschwindigkeitsvorteil wollte ich euch nicht vorenthalten. Siehe Post#1.

    Das waren doch Auszüge vom JavaScript.

    Ja, das man bei einer *.au3 nur 50% der Zeilen braucht war von aus zu gehen.

    Das funktioniert aber auch mit JavaScript:

    Code
    val = '98765';
    value = '0000000000' + val
    value = value.slice(-10)
    value = 'xxxxxxxxxx' + val
    value = value.slice(-10)

    Warum? :/ Weil ich die Lösung benötige.

    Das geht doch viel einfacher:

    AutoIt
    $iValue = 99999
    $sValue1 = StringRight('0000000000' & $iValue, 10)
    $sValue2 = StringRight('xxxxxxxxxx' & $iValue, 10)
    ConsoleWrite('$sValue1 = ' & $sValue1 & @CRLF)
    ConsoleWrite('$sValue2 = ' & $sValue2 & @CRLF)

    Lass das Contextmenü bestehen und lösche nur die MenuItem(s):

    Ich habe den Code noch etwas abgeändert, damit es bei sehr vielen Fundstellen nicht zu unnötigen Verzögerungen kommt (viele Dll-Calls).

    Neue Version in Post#1.

    Müsste man mal mit purem AutoIt vergleichen...

    Aus Neugier habe ich das mal getan:

    AutoIt: 120976 ms

    AutoIt mit Nim-Dll: 238 ms


    Zeitfaktor: mehr als das 500fache bei purem AutoIt.


    AutoIt mit Nim-Dll, wie oben, nur mit "Richtlinie" als Suchwort:

    Testscript (AutoIt) hier:

    Da fühle ich mich gleich schlecht, dass ich soetwas ähnliches in der SB nachgefragt habe,

    Ich gebe zu, dass Deine Frage in der SB den Ausschlag dafür gab, aber ich finde, dass man sowas in AutoIt durchaus mal gebrauchen kann.

    Und es war eine Übung, um in Nim zu programmieren. :)

    Im Übrigen ist das Ganze wirklich schnell. Bei mir dauert die Suche (so wie im Beispiel) nur rund 280ms. Bei 207336 Wörtern ist das nicht schlecht, denke ich.

    Müsste man mal mit purem AutoIt vergleichen... ^^

    Wenn man in AutoIt ein Wort in einem Text sucht, nimmt man normalerweise StringInStr dafür oder bastelt etwas mit StringRegExp.

    Das ist meistens ausreichend und auch schnell genug.

    Wenn man allerdings eine "unscharfe" Suche möchte, wird es kompliziert und langsam. Die sogenannte Levenshtein-Distanz (oder in Prozent umgerechnet) gibt die Ähnlichkeit zweier Wörter zurück.

    In AutoIt ist die Funktion aber sehr zeitaufwändig und wenn man einen größeren Text durchsuchen will, dauert es sehr lange.

    Da ich die Levenshtein-Distanz bereits in Nim übersetzt habe, dachte ich mir, das kann ich dann doch auch für AutoIt zur Verfügung stellen (als DLL).

    Die Suche habe ich dann auch gleich in Nim geschrieben, so wird es noch etwas schneller.


    Edit 03.10.2020:

    Ich habe den Nim-Quellcode jetzt dahingehend geändert, dass gleich alle Fundstellen (als String) zurückgegeben werden.

    Das hat den Vorteil, dass bei sehr vielen Fundstellen nur ein DllCall von AutoIt aus erforderlich ist. Im Worstcase-Fall (Suchbegriff: ein Buchstabe und Null Prozent) würde sonst für jedes Wort ein Dll-Call nötig sein, was recht zeitaufwändig ist.


    Edit 06.10.2020:

    Die Nim-interne Funktion zur Berechnung der Levenshtein-Distance editDistanceAscii() ist deutlich effektiver, als die von mir konvertierte Funktion. Die Laufzeit des Beispiels schrumpft somit von vorher 238ms auf nunmehr 66ms.

    Ich finde, das ist eine neue Version wert. :)


    Der Nim-Sourcecode sieht so aus (zum compilieren des Codes als Dll den Compiler folgendermaßen aufrufen: nim c -d:release --app:lib FuzzySearch.nim

    Für die, die kein Nim installiert haben, habe ich die DLL bereits compiliert mit ins ZIP-Archiv (Anhang) gepackt.

    Das AutoIt-Beispiel sieht dann so aus:

    Wichtig ist noch, dass ihr das AutoIt-Script als 64-Bit-Version ausführt #AutoIt3Wrapper_UseX64=y, weil Nim eine 64-Bit-DLL erstellt.

    Alle Quellcodes und den Beispieltext (BGB mit 207336 Wörtern) findet ihr im ZIP-Archiv.

    Dateien

    • FuzzySearch.zip

      (421,58 kB, 6 Mal heruntergeladen, zuletzt: )

    Warum compilierst Du das Script nicht als CUI-Programm?

    Dann funktioniert ganz einfach ConsoleWrite:

    Ich habe mir mal das Wireshark-Protokoll angesehen. Die Zieladresse ist wohl eher: 192.168.178.55

    Aber egal.

    Hier die Aufzeichnungen von den ersten drei Paketen:

    Jeweils die letzten 15 Bytes enthalten die übertragenen Daten (ab 70 07 01).

    Was diese "70 07 01" sind kann ich nicht sagen, aber danach die drei Bytes scheinen die Uhrzeit zu sein.

    Du sagtest, dass Du die Aufzeichnung um 06:30 Uhr gestartet und bis 06:40 Uhr laufen gelassen hast.

    1. Paket: Hex 06 1e 14 = 06:30:20

    2. Paket: Hex 06 1e 28 = 06:30:40

    3. Paket: Hex 06 1f 00 = 06:31:00

    und so geht es weiter bis

    n. Paket: Hex 06 28 28 = 06:40:40

    Ideen?

    So:

    Als kleine Ergänzung:

    Für so einfache "Grafiken" braucht man keine externen Imagedateien. Die kann man auch direkt zeichnen:

    Insofern kann jede Jahreszahl als valide angenommen werden. Tut keinem weh.

    Ja, ok! Das Jahr könnte man weglassen (wobei die Jahre ab 1000 wohl als "gesichert" gelten, davor gab es ja einige "Meinungsverschiedenheiten" bei den Päpsten).

    Aber den Monat solltest Du schon testen, denn getDaysInMonth prüft den nicht.

    Code
    import times
    proc dateIsValid(y, m, d: int): bool =
    result = if (m in 1..12) and
    (d in 1..getDaysInMonth(cast[Month](m), y)): true else: false
    echo dateIsValid(2020, 2, 29)

    habt ihr keine Idee, woran das liegen könnte? Macht mich echt kirre, dass ich Nim nicht bzw. nicht mehr richtig ans Laufen bekomme.

    Hast Du VSCodium über scoop installiert scoop install vscodium?

    Ich habe nämlich gerade ein Update gemacht scoop update vscodium und bei mir läuft das neue VSCodium (v1.49) problemlos.