ortogonale Zuordnung von Varibalen

  • Ich habe da so eine Idee, die ich versuche irgendwie von der Therie auf Papier zumindest hin zu bekommen.

    Erklärung / Spielaufbau:

    Ich habe ein Spielfeld von: waagerecht 30 x senkrecht 46 Feldern. Damit habe ich 1380 bestimmbare Positionen.
    Nun soll durch Zufall eine Position ausgesucht werden, die aber waagerecht nicht in der ersten oder letzten Zeile
    sein darf und auch nicht in der ersten oder letzten Spalte. Das sollte / ist mit Radom machbar.
    Nun sollen von dieser ermittelten Position vier Positionen bestimmt werden die folgende Kriterien erfüllen:
    jeweils ein Wert muss in der gleichen Spalte über der Position sein und, einer rechts davon, einen da drunter und
    einer links davon.
    Nun haben wir schon Position X, den ich mal mit der deutschen Bezeichnung "Schwarzer Peter" betitel und die
    vier Positionen, die ich mal "Kreuzpositionen" betitel.
    Nun kommen noch drei weitere Positione dazu, die folgende Kriterien erfüllen müssen: Die drei Positionen dürfen
    sich nicht im 90 Grad Winkeln selber kreuzen, noch sich mit den vier "Kreuzpositionen" im 90 Grad Winkel.

    Nun haben wir folgende Positionen, die wie folgt befüllt werden:
    1 x Schwarzer Peter (fünfstellige beliebige Zahl, die keine Primzahl ist)
    4 x Kreuzposition (fünfstellige Primzahlen)
    3 x weitere Position (fünfstellige Primzahlen)
    1372 x sonstige fünfstellige Zahlen, die jedoch keine Primzahlen sein dürfen.

    fünfstellige Zahl = 00000 - 99999

    Der Spass daran ist es, im KOPF die Primzahlen zu finden, sie im Kopf miteinander zu verbinden (ortogonale
    Zuordnung) und die einzige Position zu finden, wo sich vier der sieber Primzahlen im 90 Grad Winkel kreuzen.
    Die Frage ist immer: wo ist der "Schwarze Peter"?

    So, das ganze klappt auf dem Papier, aber dann weiß man ja selber die Lösung, was ja doof ist.

    Mal ein Bild zu optischen Erlärung:
    Die roten Verbindungen werden nur im Kopf gezogen, genauso wie das finden der blauen und des schwarzen
    Position.
    black_peter_verbunden.jpg


    WIE SOLL MAN DA RICHTIG VORGEHEN ???

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo Alina,

    wenn ich das richtig verstanden habe lautet die Spielanweisung:
    "Finde den schwarzen Peter, der keine Primzahl ist. In der Spalte des schwarzen Peter befinden sich GENAU 2 Primzahlen, in der Reihe des schwarzen Peter befinden sich GENAU 2 Primzahlen"

    Was ich nicht verstanden habe ist die Sache mit den 3 weiteren Primzahlen, deren Position imho völlig unerheblich dabei ist, den schwarzen Peter zu finden!

    Umzusetzen ist das ganze relativ einfach, du musst nur die 5 Punkte "schwarzer Peter" ausfüllen und dann dessen Reihe und Spalte ausfüllen, allerdings ohne Primzahlen!
    Dann wird das restliche Spielfeld (es ergeben sich 4 Quadranten) mit den übrigen Zahlen von oben nach unten ausgefüllt.
    Einzige Regel ab jetzt! Es darf keine NICHT-Primzahl geben, in dessen Reihe und Spalte jeweils eine Primzahl ist, denn das wäre automatisch ein "schwarzer Peter". Daher würde ich das Spielfeld "zufällig" mit den weiteren Primzahlen füllen, und zwar so, dass sich kein "schwarzer Peter" ergeben kann! Alle anderen "nicht-Primzahlen" kannst du nun gefahrlos auf die restlichen Felder verteilen, es wird sich nie ein schwarzer Peter ergeben....


    //EDIT
    Von 0 bis 99999 gibt es 9592 Primzahlen, die lassen sich selbst auf meinem langsamen Rechner innerhalb von 2-3 Millisekunden berechnen.
    Vorgehen also folgendermaßen:
    - Schwarzer_Peter_bestimmen (aus zufälliger nicht Primzahl und 4 Primzahlen)
    - im restlichen Spielfeld zufällig alle weiteren Nicht-Primzahlen verteilen
    - Damit es schwieriger wird, zufällig x (Schwierigkeitsgrad!) Primzahlen verteilen, dabei darauf achten, dass in deren Reihe und Spalte kein weiterer Schwarzer Peter entsteht.

  • Andy:

    Du hast es genau richtig verstanden, also habe ich es doch nicht zu blond erklärt.
    Die drei weiteren Primzahlen so wie von Dir vermutet da, damit es schwieriger wird.

    Bist Du dir da sicher mit 9592 möglichen Primzahlen?
    Das würde bedeuten, das ich als ersten die Primzahlen in ein Arry schreibe. Danach eine zufällige
    Zahl zwischen 1 und 1065 auswählen. Das Array ist dann die erste Primzahl. Danach 6x immer
    plus 1065 und schon habe ich die 7 Primzahlen.

    Ja, das könnte funktionieren. Das muss ich mal im Hintergrund behalten.

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Bist Du dir da sicher mit 9592 möglichen Primzahlen?

    @'MatthiasG. hat eine func (_MathEx_CreatePrimes Erstellt Primzahlen), damit kannst du dies ganz leicht überprüfen:

    und siehe da Andy wird durch diese Funktion bestätigt: "9592 Primes found in 1.33128914455116 sec"

    '

  • :D !

    Ich dachte aber eher an diese (meine) Funktion 8o


    Das war mal eine "aus dem Ärmel" geschüttelte Version für ein µ-It, um den Faktor 1000 in der Geschwindigkeit gegenüber AutoIt auszutesten 8)
    Man beachte, es dauert wesentlich länger, die Daten aus dem Speicher in einen String zu schreiben bzw. in eine Datei, als die Primzahlen nach dem über 2000 Jahre alten Sieb des Erathosthenes zu ermitteln....wer mag, kann ja mal das Limit auf 50 Millionen setzen. Da dauert die Primzahlermittlung incl. die Umwandlung aller Primzahlen in einen String auf meinem Rechner ca. 2 Sekunden.

  • Das würde bedeuten, das ich als ersten die Primzahlen in ein Arry schreibe. Danach eine zufällige
    Zahl zwischen 1 und 1065 auswählen. Das Array ist dann die erste Primzahl. Danach 6x immer
    plus 1065 und schon habe ich die 7 Primzahlen.

    So kompliziert würde ich das garnicht machen....
    Die Primzahlen hast du doch sowieso schon, also ist die zufällige Primzahl doch $primzahl=$primzahlenarray[random(1,ubound($primzahlenarray)-1,1)), welche du einfach an eine zufällige Position im Spielfeld schreibst.
    Dann brauchst du nur noch eine Funktion _Test_auf_Schwarzer_Peter(). Wenn diese eben geschriebene Primzahl einen weiteren "Schwarzen Peter" verursachen würde, dann setze sie einfach an eine andere Position.....

  • @autoBert:
    Sieht gut aus. Habe ja bereits eine Primzahlberechnung gehabt, aber die schauen ich mir gerne zusätzlich an.

    @Andy:
    Wie Du es gepostet hast ($maximum = 99999), sagt er, das er 0 Millisekunden benötigt hat.
    Bei 500000 benötigt er: 5 Millisekunden und es sind 41538 Prim's.
    Habe gerade den $maximum mal auf "50000000". Und er läuft und läuft und läuft weiter.


    asm? ich dachte immer, das es ASM nicht mehr gibt und nur noch von "alt gesessenen" genutzt wird.
    Da habe ich aber reingeschaut und ich verstehe da nicht viel. Habe verstanden das es da
    paar "Aufrufe" gibt, die abzuleiten sind vom "Batch'en / Dos'sen", aber das war es auch.
    mov = verschieben
    cmp = vergleichen
    push = sichern
    xor = ein Vergleich
    ebx = Register (Speicherplatz?)
    div = Division
    add = Addition
    pop = Aufruf (dann wäre ja aufrufen = poppen LOL)
    dword = doppeltes Wort ( 2x word = 1 dword, habe ich mal irgendwo gelesen oder gehört?)

    Irgendwann hat man mir mal diese Sachen XOR / OR / AND / AND OR versucht zu erklären an Hand von
    Lichtschaltern. Sorry, da sind dann irgendwann bei mir die Leuchten ausgegangen. Ich glaube, das ist
    wieder so eine Sache, die verstanden wird oder nicht, aber wenn, dann richtig.

    So, ich möchte dann mal weiter machen.

    Schönen Samstag !!!

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • asm? ich dachte immer, das es ASM nicht mehr gibt und nur noch von "alt gesessenen" genutzt wird.

    fast richtig, "alt Eingesessene" gab es schon immer, genau wie es schon immer einen Grund gab, die vorhandene Hardware optimal auszunutzen. Assembler hat aber ganz- und garnichts mit "alt" zu tun, gerade im Gegenteil, wenn man moderne Features von Prozessoren nutzen will/muss, bleibt einem meist nichts anderes übrig als mit Assembler zu programmieren da die "modernen" Compiler viele Prozessorbefehle (noch) nicht implementiert haben.

    Es ist schon seltsam, noch nie gab es so schnelle Prozessoren wie heute, und trotzdem steigt der Anteil an Assemblerprogrammen (auch Programmierern?! ) in letzter Zeit wieder an:
    http://www.heise.de/developer/meld…in-3263014.html

    Viele Programmierer müssen sich aber mit Blick auf die Ausführungsgeschwindigkeit ihrer Programme absolut keine Gedanken machen, der Prozessor dümpelt sowieso meist nur im Idle rum, der schnellste Tastaturakrobat schafft es nicht mal, einen Prozessor aus dem Schlafmodus zu holen.
    Such mal nach "Prozessorlast" hier im Forum, da wird der Irrsinn offensichtlich! Da werden >4Ghz Prozessoren gekauft, damit man "Leistung" hat, und wenn bei diesen Prozessoren die Last über 3% steigt, fängt das große Zittern an. Da werden dann "Sleep()"-Befehle eingebaut, damit das Hochleistungsgerät bei 1%%% der Maximalleistung arbeitet.
    Dort, wo Code mit Blick auf Geschwindigkeit oder/und Größe optimiert werden MUSS, wird immer noch Assembler eingesetzt, s. bspw. hier: https://en.wikipedia.org/wiki/Assembly_…e#Current_usage


    [OT]
    Wenn ich einen Blick in die Zukunft von Assembler werfe, dann sehe ich dessen Ende auf den gängigen Rechnerarchitekturen (seitens Otto-Normal-Programmierern). Es wird bald soweit sein, dass Code nur noch in "abgeschotteten" Bereichen im Speicher laufen wird, der nicht einmal Zugriff von Disassemblern/Debuggern erlaubt. Das Märchen von den Vorteilen von Open-Source wie "Freiheit, offene Quellen, finden von Bugs und Anpassung auf eigene Bedürfnisse" ist seit Jahren schon ausgeträumt, 85% der Nutzer geben keine/geringere Lizenzkosten als Hauptaugenmerk für die Verwendung von Open-Source an. Von diesen 85% hat nicht mal 1% auch nur die Möglichkeit, Sourcecode auszuwerten, geschweige denn zu optimieren/verbessern/auf eigene Bedürfnisse anzupassen!
    Die Zukunft wird aus völlig "zugenagelten" Rechnern bestehen, die unter der absoluten Kontrolle der Hersteller (Hardware und BS) stehen. Dem User wird ein kleiner Bereich gestattet in dessen eng gesteckten Grenzen er agieren darf, da wird es keine eigenen Bootloader/Treiber/Systemprogramme mehr geben. Brave new world...[OT]

    paar "Aufrufe" gibt, die abzuleiten sind vom "Batch'en / Dos'sen", aber das war es auch.

    naja, mit BATCH/DOS hat das absolut nichts zu tun, mov, cmp, usw. sind Prozessorbefehle, welche mit den Prozessor-Registern arbeiten. Also direkt am offenen Herzen des Rechners. Kein Netz, kein doppelter Boden, jeder kleinste Fehler führt zum Crash!


    Irgendwann hat man mir mal diese Sachen XOR / OR / AND / AND OR versucht zu erklären an Hand von
    Lichtschaltern.

    https://de.wikipedia.org/wiki/Logikgatter
    Wenn man die Funktion begriffen hat, bieten sich dem Programmierer in einigen Situationen große Vorteile bzgl. Codelänge und Geschwindigkeit. Guck mal in die AutoIt-Beispiele, in denen Styles und ExStyles verwendet werden, je nach Anwendung spart da ein einziger BitOR()-Befehle viele Zeilen Code.
    Man hat bspw. auch die Möglichkeit, die Zustände von 32(64) Checkboxen/Lichtschaltern in einer einzigen 32(64)-Bit-Variablen zu speichern.

  • Moin Andy.

    Das werde ich mir alles gleich mal in der Ruhe ansehen. DANKE !

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl