Beiträge von XovoxKingdom

    Hallo,


    du hast schon ganz recht, dass Singleton das richtige Muster ist.

    Und mit genau dem Schlagwort kannst du doch beim nächsten Mal auch gerne die Hilfedatei, die auch in Deutsch erhältlich ist, durchsuchen. Diese ist sehr nützlich und enthält zudem Codebeispiele.


    Hier ein nur minimal angepasstes Codebeispiel, das der Hilfedatei entnommen wurde:


    AutoIt
    #include <Misc.au3>
    #include <MsgBoxConstants.au3>
    If _Singleton("test", 1) = 0 Then
    ; Hier muss der Code rein, wenn es vorher bereits aufgerufen wurde und die erste Instanz noch läuft
    MsgBox($MB_SYSTEMMODAL, "Warning", "An occurrence of test is already running")
    Else
    ;Hier muss der Code des ersten Programmstarts rein
    MsgBox($MB_SYSTEMMODAL, "OK", "the first occurrence of test is running")
    EndIf

    Hallo zusammen,


    Ich komme gerade nicht auf die Lösung eine Abfrage zu schreiben, die mir das nachfolgende Problem löst.
    Ich habe folgende (auf die Problemstellung vereinfachte) Tabellen, mit einer n-m Beziehung zwischen box und item verknüpft über box_item :


    box


    boxid boxname
    1 box1
    2 box2
    3 box3


    box_item

    boxid itemid
    1 1
    1 2
    2 1
    2 3
    3 1
    3 2



    item


    itemid itemname
    1 item1
    2 item2
    3 item3
    4 item4
    5 item5


    Ich muss jetzt die boxid's jener Boxen bekommen, die eine gegebene Menge von itemid's enthalten.
    Bspw. würde ich erwarten, dass die Abfrage für die itemids {1,3} die boxid {2} zurückgibt.
    Bei der Abfrage für die itemids {1,2} soll das Ergebnis die boxids {1,3} sein.
    Falls nicht alle itemids in einer box enthalten sind, soll eine leere Menge zurückgegeben werden. Bspw. itemids {1,2,3} führt zu boxids {}
    Falls alle itemids in einer box enthalten sind, allerdings noch weitere items in der box sind, so soll auch eine leere Menge zurückgegeben werden. Bspw. itemids {1} führt zu boxids {}.


    Hier meine Startlösung, die leider nicht das gewünschte Ergebnis bringt:


    SQL
    select boxid from box natural join box_item natural join item where itemid = 1 or itemid = 3

    Im Programmcode wird dann später itemid insofern parametrisiert, dass nach beliebig vielen itemids mit benutzerdefinierten Werten gesucht werden kann.

    Aber genau DAS meinte ich doch...
    $array=_ArrayPermuteXXX("abcde","01020") , gibt dir Permutationen zurück, die "ace" an den ersten 3 Stellen verwenden ("gute Lösungen"), b und d kommen IMMer hinten an!

    Ich kenne die 'guten' Permutationen zu Beginn nicht! Ich schicke also erstmal alle Nodes mit ihrer Todo-List (=disjunkte Menge an Permutationen) los und lasse sie rechnen.
    Im Laufe der Zeit werden sie merken, dass ihre ihre Lösung nicht gut werden kann und sie Abbrechen.
    Als Abbruchkriterium gilt eine Fehlergrenze epsilon, die zur Terminierung führt.


    Programmiertechnischer "Dünnschiss"!
    Wenn der Node etwas "merkt" , ist es schon passiert! Denn die "schlechte Lösung" wurde bereits berechnet!

    :huh: , was soll das denn? :thumbdown:
    Ich würde es Branch-and-Bound nennen, das ich für eine greedy "variable selection" (machine learning) verwenden will. Der Fehler ja systematisch, sodass ein Abbruch sinnvoll ist!
    Ab einem gewissen Punkt macht es keinen Sinn mehr weitere zu droppen, weil das Modell zu schlecht wird. Aber um die aussagekräftigsten Variablen x[] zu finden, nimmt man erstmal alle und beginnt dann nach und nach welche aus der potenziellen Menge theta[] zu entfernen. Dabei ist logischerweise die Reihenfolge wichtig, da es Interdependenzen gibt.


    Ich habe es nun geschafft eine wie oben beschriebene Funktion zu schreiben, die nicht mit Gewichten arbeitet und so - wie gewünscht - alle Permutationen berechnen muss.
    Falls jemand an der Lösung interessiert ist:


    Der Kern ist die getPermutation Funktion, die ein Array $aArray und einen Wert $v, die die $v-te Permutation zurückgibt.
    Der obere Teil prüft, ob alle Permutationen meiner Funktion auch in _ArrayPermute vorkommen. Die Reihenfolge ist allerdings anders, was mich nicht stört.


    Danke für die Hilfe. Das mit den Gewichten würde sicher funktionieren, aber alle Permutationen aufzulisten und danach zu sortieren - wenn ich dich, Andy, richtig verstanden habe - würde lange dauern.
    Sinnvoll wäre es aber sicher, wenn ich im Vorfeld die schlechten Lösungen kennen würde. Das habe ich anfangs sehr unklar geschildert, wie ich merke X/
    Ich meinte eigentlich, dass ich zu einem beliebigen Zeitpunkt feststellen kann, dass ein Pfad in dem 'Permutationsgraphen' kein Sinn macht und ich den dann abbreche.
    Und das setzt voraus, dass ich zu einem anderen Ast springen kann. Daher die Idee mit dem Index, der mich direkt zu einer anderen Permutation bringt.
    Da meine Funktion eine gewisse Form von Struktur (Sortierung) hat, lassen sich bestimmte Indexmengen sofort ausschließen.

    In welchem Universum ist 5! denn 720?

    :whistling: ja, hab teilweise mit 6! gearbeitet. Danke für den Hinweis, aber den Fehler hab ich bei meinen Überlegungen (leider) nicht gemacht, sodass das nicht mein Problem ist.




    Schreibe die _ArrayPermute() so um, daß du den einzelnen Symbolen ein "Gewicht" mitgeben kannst, dann wird ArrayPermute nach diesen Gewichten sortieren

    Ja, kann man sicherlich machen. So hätte ich das Teilproblem gelöst, dass "b" nicht an Position 1 steht. Dennoch muss ich alle Permutationen einmal berechnen und genau das will ich verhindern! ;)


    Ich will eine Funktion, die mir eine Permutation in Abhängigkeit des übergebenen Parameters gibt. Dann kann jeder Node unabhängig voneinander rechnen, die Startpunkte sind äquidistant verteilt und es gibt bis zum Ende keine Dopplungen. Sollte ein Node 'merken', dass seine Permutationen nicht zu einer (guten) Lösung führen, dann kann es mit einer anderen Permutation beginnen, die einem anderen Node zugewiesen wurde, aber noch nicht berechnet wurde.

    Hallo zusammen,


    ich habe vor einen klugen Bruteforce-Algorithmus zu schreiben. Der kluge Anteil besteht darin möglichst früh ungültige/schlechte Lösungen zu überspringen.
    Bei den Parametern "a,b,c,d,e" habe ich logischerweise n = 5 => 5! = 120 Möglichkeiten diese zu kombinieren. Vielleicht macht aus irgendeinem Grund "b" an Stelle 1 keinen Sinn, sodass ich viele Berechnungen sparen kann.
    Die Berechnungen sollen weiterhin parallelisierbar sein, also bräuchte ich in dem Beispiel 4 Nodes, die jeweils mit einem anderen Buchstaben anfangen, da das "b" an Stelle 1 ja keine gute Lösung bringt.
    Jede 'Buchstabenkombination' steht exemplarisch für einen Lösungsweg, der ausprobiert werden muss.
    Jetzt zu dem, was mir fehlt:
    Ich brauche eine Funktion, die mir zu einem gegebenen Index die entsprechende Permutation gibt:

    Code
    f(1) := "a,b,c,d,e"
    f(2) := "a,b,c,e,d"
    ...
    f(720) := "e,d,c,b,a"



    Die Baseline ist eine Enumeration aller Möglichkeiten, die in einem Array gespeichert wird. Anschließend kann man per Index auf die entsprechende Permutation zugreifen.
    Das Problem ist, dass bei wachsendem "n" der Speicherverbrauch faktoriell steigt. Bei 4 Nodes will ich dann jedem einen Indexbereich geben, auf dem alles ausprobiert wird.
    Also z.B. bekommt Node1 [1, 144], Node2 bekommt [288, 432], Node3 bekommt [433, 576] und Node4 bekommt [577, 720], weil "b" an Stelle 2 ja ignoriert werden soll.


    Hier ist die Baseline, die leider auf die Enumeration zurückgreift und exemplarisch auf f(8) := "a,c,b,e,d" zugreift, was zu Node1 gehört:



    Vielleicht habt ihr ja kreative Ideen...
    Das Muster, das ich erkannt habe, ist, dass bei den ersten 24 (=(n-1)!) das "a" an erster Stelle steht. Das "b" taucht dann bei den ersten (n-2)! = 6 Permutationen an Stelle 2 auf. "c" steht an (n-3)! = 2 der dritten Stellen. Mit n = |{"a","b","c","d","e"}| = 5.
    Ziel ist es nun einen enigermaßen effizienten Algorithmus zu finden, der das möglichst unter O(n) berechnen kann. Bubblesort n-mal anzuwenden ist nicht gewünscht!


    Ich hoffe, dass ihr ein paar Ideen oder Vorschläge habt! :)

    Schonmal Danke für die bisherigen Einschätzungen.
    Zu dem Lenovo x230t : Leider habe ich durch meine Recherche auch keine Möglichkeit gefunden, dass eine schnelle Grafikkarte eingebaut werden kann...
    Zu dem Lenovo W701ds: Die 17" sind zwar gewaltig, aber noch mehr stören tut mich, dass der Stift nur auf der kleinen Fläche bedienbar ist. Der Stift sollte direkt auf dem Display zu benutzen sein (vgl. das Tablet Samsung Galaxy Note 2014).
    Dass ich nur Lenovo-Produkte als Beispiel herangezogen habe, ist 'Zufall', da ich bisher kein annähernd leistungsfähiges Gerät von bspw. Microsoft (Surface 3 Pro) gefunden habe.
    Samsung hat zwar für Android einiges mit dem SPen, aber soweit ich weiß nichts unter Windows und gleichzeit mit viel Grafikpower.

    Hallo zusammen,


    ich bin derzeit auf der Suche nach einem Notebook/Convertible mit Windows als OS. Weiterhin sollte das Gerät in der Lage sein, dass Spiele wie Skyrim etc. flüssig laufen können.
    Ganz wichtig ist mir, dass ich einen Stift als Eingabe benutzen kann! Damit meine ich einen aktiven, wie man es von z.B. der Galaxy Note-Reihe von Samsung kennt.
    Nen schnöder Touchscreen mit nen 0815-Stift ist zu unpräzise.
    Meine Recherche hat bisher ergeben, dass Lenovo mit der Yoga-Reihe einige Touchgeräte bietet, die allerdings keine ausreichende Grafik bieten (NVidia 8-Gen sollte es schon sein).
    Als Vergleichsgerät, welches allerdings keinen Stift unterstützt sei dieses Gerät gegeben:
    http://shop.lenovo.com/us/en/l…kpad/yoga-series/yoga-14/
    Wegen des fehlenden Stifts kommt es aber nicht in Frage. Die Größe sollte zwischen 12" und 15" liegen 17" ist für meinen Geschmack zu groß...
    Mir würden entweder Produktvorschläge oder Seiten mit einer Übersicht von Gamingnotebooks/-convertibles inkl. Stifteingabe helfen.
    Ich weiß, dass die Auswahl aufgrund meiner Wünsche sehr eingeschränkt wird, aber technisch sollte doch heutzutage sowas möglich sein!
    Nen Preislimit spielt erstmal keine Rolle.


    Vielen Dank schonmal für die kommenden Tipps/Anregungen!

    Hi,


    wenn jemand das Script decompiliert, ist die Sache mit den verschlüsselten Passwörtern sowieso hinfällig.
    Also kannst du die gleich im Script lassen.
    Wenn du weisst, dass dein Script nicht decompiliert wird, sind die PW "sicher".


    Ich muss Andy vollkommen zustimmen. Die beste Verschlüsselung etc. bringt nix, wenn man den Sourcecode da hat und statt _FTP_OPEN("username",$entschlüsseltes_PW) ein MsgBox(0,"PW",$entschlüsseltes_PW) macht und dann mit seinem FTP-Client wilde Spielchen treibt.
    Es sollte also erst nach einer erfolgreichen Anmeldung auf einem Authentifizierungsserver möglich sein die Verbindung zu dem FTP-Server aufzubauen, der den Zugangstoken für den Client übermittelt.

    Mein Verdacht ist, dass du mit der Send()-Funktion arbeitest, aber den Parameter flag nicht explizit auf 1 gesetzt hast.
    Die Kombination "#r" würde die ohne das Flag die Windowstaste und "r" senden, da "#" ein Schlüsselzeichen ist.
    Folgendes sollte dein Problem lösen:
    $text = "hallo#welt"
    Send($text, 1)

    Da wir hier nicht in H&Ü sind, ist das hier eine mögliche Lösung:


    EDIT : Danke Schnitzel für das Lösen des Backslashproblems :)

    Probieren muss man wirklich nicht, da es sich ja mit einem einfachen Schema berechnen lässt.
    misterspeed hat ja schon die Formeln implizit anklingen lassen :

    • y = a + (y - a)
    • z = c + d + (z - c - d)


    Somit ergibt sich:

    Obwohl du nicht nach einem Skript gefragt hast, da du dann im Programmieranfragenforum nachhaken müsstest,
    und deine Dokumentation viel Spielraum mangels konkreter Regeln oder Beispiele lässt, ist hier eine mögliche Lösung:
    Func getSameCharacters($sString1, $sString2)
    Local $aCharachterSequence1, $aCharachterSequence1, $sOutput
    $aCharachterSequence1 = StringSplit($sString1, "")
    $aCharachterSequence2 = StringSplit($sString2, "")


    For $i = 1 To $aCharachterSequence1[0]
    If StringInStr($sString2, $aCharachterSequence1[$i]) And Not StringInStr($sOutput, $aCharachterSequence1[$i]) Then
    $sOutput &= $aCharachterSequence1[$i]
    EndIf
    Next


    Return $sOutput


    EndFunc ;==>getSameCharacters


    $sWord1 = "Apfelbaum"
    $sWord2 = "Sonnenstrahl"
    $sWord3 = "Waldweg"


    $sOutput = getSameCharacters(getSameCharacters($sWord1, $sWord2), $sWord3)
    MsgBox(317 * Sqrt(727609), "Alle gemeinsamen Zeichen", "Alle gemeinsamen Zeichen von :" & @CRLF _
    & $sWord1 & @CRLF & $sWord2 & @CRLF & $sWord3 & @CRLF & @CRLF & $sOutput)

    Vielen Dank für das schöne, leicht nachvollziehbare Tutorial! :)
    Mir ist beim Testen folgendes aufgefallen:
    Das AutoIt Script selbst liegt immer bei ~2.500 +- 200 und das unabhängig von x64 oder x86.
    x64 dll mit x86 AutoIt Script : 1.019.675
    x64 dll mit x64 AutoIt Script : 26.677
    x86 dll mit x86 AutoIt Script : 27.254
    x86 dll mit x64 AutoIt Script : 1.578.805


    Ich hab Windows 7 x64 installiert und die Test ~2-3mal ausgeführt mit ähnlichen Resultaten.
    Warum sind die Ergebnisse eines 'nicht passenden' AutoIt Scripts mit einer dll (x86 & x64) besser, als beide der gleichen Version (x64 & x64 bzw. x86 & x86)?

    Hier ein bisschen Feedback/Wüsche:
    Erstmal hast du zwar ohne Kommentare programmiert, aber auch ohne C Kenntnisse konnte ich die Idee deines Skriptes ganz gut nachvollziehen.
    (Selbst wenn ich das Sieb des Eratosthenes nicht bereits gekannt hätte)
    Ich bin zwar keineswegs mit C vertraut, aber dein Sieb des Eratosthenes hätte doch auch in einer Liste von Wahrheitswerten implementiert werden können und dadurch einen kleinen Geschwindigkeitsboost bekommen können, oder?
    Als Erweiterung könntest du ja die Liste in k viele Teile teilen, die von k Threads bei jedem "Sieben" je ein Stück aktualisieren.
    Ich habe den Code zwar nicht getestet, war aber von dem Titel angetan (...), da ich aber keine Liste aller Primzahlen von 2 bis n brauche und von C so gut wie keine Ahnung habe,
    würde ich dich um folgendes Features bitten:
    Eine Funktion IsPrime(x) : boolean, die auf Primzahlen prüft.
    D.h. man kann eine beliebige natürliche Zahl auf ihre Primzahleneigenschaft prüfen. Dazu fallen mir spontan 2 Verfahren ein:
    AKS-Primzahltest (nicht probabilistisch soweit ich weiß und daher hilfreich für mich)
    Miller Rabin Test (probabilistisch)
    *weitere, möglichst effiziente(re) Verfahren die nicht probabilistisch sind fänd ich auch gut*
    Der naive Ansatz die Zahl x auf alle Teiler < WurzelAus(x) dauert viel zu lange, wenn die Primzahl ca. 100 Stellig (<=>10^100) ist.
    Ich würde es Klasse finden, wenn du das mal in C probieren könntest :)

    Ich würde mir entweder mehr Beispiele wünschen, oder eine Art BlackBox, die wir selber mit beliebigen Eingaben füttern können ohne den Algorithmus vor Augen zu haben.
    Sofern man das Verfahren bei Kenntnis des Verschlüsselungsverfahrens knacken kann (z.B. Caesar-Chiffre), ist es wohl für AutoIt nur suboptimal geeignet ;)


    @jjj : Man kann nicht bestimmen wieviele (endliche) Begriffe man braucht um das unbekannte Verschlüsselungsverfahren und die zugehörige Entschlüsselung zu ermitteln.
    Ein einfaches Beispiel wäre, dass ein Text bis zum 1000sten Zeichen mit einer +1 Caesar-Chiffre 'verschlüsselt' wird, aber die darauffolgenden, also 1001, 1002 etc. mit einer +2 Caesar-Chiffre verschoben werden.
    Wenn das Verschlüsselungsverfahren unbekannt ist, hängt die Menge der Entschlüsselungsverfahren von den gegebenen Eingabe->Ausgabewerten ab. Wären diese nur z.B. 100-stellig, so würde man wohl vermutlich auf die Caesar-Chiffre kommen. Sind mehr Beispiele gegeben, so würde man wohl den Verdacht - da kein Gegenbeispiel existiert - weiter verfolgen und als Lösung vorschlagen. Sicher kann man sich aber nur nach einer ausschöpfenden Suche sein, d.h. man probiert alle Eingaben aus und wertet für sich das verschlüsselte Ergebnis aus. Nur stellt sich hier die Frage : Wie viel willst du ausprobieren? Alle Kombinationen mit 1-10 Zeichen? 1-100? 1-1000? Bis dahin scheint alles richtig zu sein. Die 1001 hätte in diesem plakativen Beispiel erst die Theorie verworfen... Aber für das 'Ausprobieren' mithilfe der ausschöpfenden Suche (->Bruteforce) würde uns zumindest eine Schnittstelle fehlen, sodass wir (zumindest stichprobenartig) unsere Eingaben testen können.

    Vielleicht kannst du ja noch ein paar weitere Beispiele der Verschlüsselung anbieten, sodass das Schema ein wenig 'einfacher' zu Lösen ist.
    Z.B. würden mir ggf. die folgenden Zeichenketten helfen:
    "a"-> ?
    "A"-> ?
    "p"-> ?
    "P"-> ?
    "PP"-> ?
    "pp"-> ?
    "papapapapapa" -> ?
    "PAPAPAPAPAPA" -> ?
    (...oder weitere Zeichenketten deiner Wahl)


    Schätzt du den Schwierigkeitsgrad eher als niedrig oder als potentiell sehr hoch ein?

    Hi,
    ich versuche mich mal grob an einer Lösung:


    Vielleicht gibt dir der Pseudocode, sofern er überhaupt lesbar und nachvollziehbar ist, ein paar Anregungen :)

    Hi,
    ich habe dank UEZ's Vorlagen ein Skript erstellen können, dass die Mausbewegung nachzeichnet und nach einer bestimmten Zeitspanne nach und nach ausblendet.
    Leider sind die nachgezeichneten Linien nicht wirklich rund bzw. 'flüssig' und meine Mathekenntnisse sind beschränkt, da ich wohl sonst sowas wie Splines probieren würde.
    Wie kann man die beabsichtigten Kurven wirklich rund machen?
    Zudem komme ich beim Ausführen auf genau 85 gezeichnete Linien, kann man das noch beschleunigen, sodass da noch mehr geht?
    Die Anzahl der Linien wird im Titel angezeigt, bzw. in $time[0] gespeichert.


    Hier das Skript: