MewXs kleiner Technik-Contest - Auswertung!

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • So... Code abgeschickt (Hoffentlich hab ich die Aufgabe richtig verstanden ^^ )
      Das hat ja fast schon Spaß gemacht ;)
      www.glowingorb.de
      „Wenn es im Universum noch irgendwo intelligente Lebewesen gibt, dann kennen sie vielleicht Schach, höchstwahrscheinlich jedoch GO

      (Schachweltmeister Emanuel Lasker)
    • Hab auch was eingeschickt, aber ich glaub, es war heute zu spät (hab um 0:30 begonnen) um eine sinnvolle Lösung zu finden. Wenn ich Zeit habe, mach ich das nochmal von vorne und sende es ein.
      Einige meiner Spiele:
    • so, Einsendeschluss it vorbei und ich habe alle PNs, die bis gestern zur Deadline ankamen, gesammelt und werde nun die Auswertung machen. Geduldet euch ein halbes Stündchen, dann ist es vllt schon so weit.

      edit: Ach, ist ja Sonntag, nicht Freitag. Soooorrry, ich bin noch etwas verpennt. :O
    • RE: MewXs kleiner Technik-Contest

      Ich habe zwar nicht mitgemacht, aber wieso ist jetzt schon Schluss?
      Original von MewX
      [...]
      Einsendeschluss ist der 23.4.06 um 20.00 Uhr. Einsendungen wie gesagt an mich per PN. Wer seine Lösung anderweitig vorher auf dem Forum veröffentlicht oder Tipps gibt, wird aufs Grausamste bestraft. Also Zurückhaltung bitte. ^^
      [...]


      edit: hat sich ja dann erledigt.. :D

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Basti ()

    • Ich fänds toll, wenn nach Einsendeschluss alle Einsendungen, möglicherweise auch anonym, veröffentlicht würden, damit man selbst vergleichen kann, wie man es auch lösen könnte.
      Wenn das nicht von zentraler Stelle bewerkstelligt wird bitte ich hiermit alle Teilnehmer ihren Code nach Einsendeschluss zu veröffentlichen. :D
    • So, der Wettbewerb ist ausgewertet. Hier mein Resüme der 10 endgültigen Einsendungen:

      Die Aufgabenstellung
      Für den Wettbewerb sollte eine möglichst kurze und damit effiziente Methode zum Auslesen einer bestimmten Binärstelle entwickelt und umgesetzt werden. Dieses Skript sollte den Syntax binary_check(value,powerof2:real) haben.

      Problemlösung
      Es gab viele Wege, eine Lösung für das Problem zu finden. Die Grundstruktur sah aber immer so aus:
      1. Die Zahl aus einem binären Blickwinkel betrachten
      2. Die Zahl auf dieser Ebene analysieren
      3. Das Ergebnis der Analyse wiedergeben
      Während 3. wohl kein Problem darstellen sollte (return-Statement), und 2. sich aus 1. ergibt, gilt das ganze Augenmerk nur dem ersten Punkt.
      Um diesen binären Blickwinkel, wie ich es genannt habe, zu erreichen, war die wohl naheliegendste, die Zahl in Form eines Strings wie "010110" zu konvertieren, und dann die entsprechende Stelle zu untersuchen. Vier der zehn endgültigen Einsendungen gingen nach diesem Schema vor.
      Ist der Umweg über einen String aber wirklich nötig? Wohl eher nicht. Zwei bzw. Drei Einsendung analysierten die Zahl mithilfe einer Schleife, um sich über die Anzahl der Stellen im Klaren zu werden, um dann wiederum präzise Auskunft geben zu können. Ein findiger Mathematiker hätte die Anzahl der Stellen allerdings mit dem 2er-Logarithmus bestimmen können (Agnahim hat dies in seinem ersten Anlauf getan). Nichtsdestotrotz blieb die Schleife beliebt, ob in Form eines for- oder while-Statements oder einer Verschachtelung des Skriptes in sich selbst, um sicherzugehen, dass keine höhere Binärstelle für die Bildung der Dezimalzahl verantwortlich ist (256 ist z.B. durch 2 teilbar, dennoch ist die zweite Stelle nicht 1).
      Allerdings gibt es mathematische Streiche, die diesen Analysepunkt stark vereinfachen. Agnahim, der insgesamt drei verschiedene Einzeiler einsandte, löste es in seinem ersten Anlauf so:

      GML-Quellcode

      1. return (argument0 >> log2(argument1)) mod 2;

      Wie zuvor beschrieben, gibt log2(arg1) die Anzahl der Binärstellen wieder. Der >>-Operator "verschiebt" die Zahl auf Binärebene nach rechts (<< nach links). Das heißt aus die 1 aus 100(binär) wandert bei 100 >> 2 an erste Stelle, also 001. mod 2 überprüft schließlich, ob das Ergebnis dieser Rechnung eine gerade oder ungerade Zahl ist. Das erkläre ich aber später. Aber ziemlich genial, oder? Naja, ganz nett vielleicht, denn ">>" ist nur ein Binäroperator von vielen, die der GM bietet.
      Unzufrieden mit ihren alleinigen Ergebnissen schlossen boxxar und Windapple sich zusammen, gemeinsam eine Lösung auszuarbeiten - da habe ich nichts gegen einzuwenden, schließlich sind sie als Mitglieder des Teams sowieso vom regulären Wettbewerb ausgeschlossen.
      Sie lieferten diese Lösung:

      GML-Quellcode

      1. return (argument0&argument1)&&true;

      Was geht hier ab? & vergleicht zwei Zahlen auf Binärebene. Wenn beide Zahlen an der gleichen Stelle eine 1 haben, so hat auch die Ergebniszahl an dieser Stelle eine 1. bei 10110 und 11101 wäre das Ergebnis z.B. 10100. Da argument1 allerdings eine Zweierpotenz sein muss, hat es nur an einer Stelle eine 1. Somit kann das Ergebnis nur 0 oder eine Folge aus 0 mit einer einzigen 1 sein. Dies wird mit && überprüft. && vergleicht boolesche Werte. Boolesche Werte sind 1 oder 0. Dabei wird jede Zahl außer 0 als true angesehen, die 0 selbst als false. true und false werden im GM durch 1 und 0 repräsentatiert. Dieser Vergleich über && prüft also nach, ob argument0&argument1 true ist, also ungleich 0. Dies ist aus unserer vorherigen Überlegung der Fall, wenn auf Binärebene irgendwo eine 1 vorkommt. Das script gibt somit 1 wieder, wenn (argument0&argument1) ungleich 0 ist. Sehr raffiniert.
      Mit seiner dritten Lösung (die zweite folgt am Schluss) zeigte Agnahim allerdings unfreiwillig, dass man sich auch zusehr in das Kaufmanns-Und verlieben kann. Er lieferte dies:

      GML-Quellcode

      1. return (argument0 & argument1) > 0;

      Der erste Teil ist gleich, allerdings verzichtet er auf einen komplizierten booleschen Vergleich und fragt einfach, ob das Ergebnis größer als 0 sei. So simpel kann es dann doch sein.
      Neben den Bit-Operatoren gibt es ja aber auch noch die halbwegs "normalen" Operatoren. Interessant sind da div und mod. div teilt ganzzahlig. 5 div 2 wäre z.B. 2 und nicht 2.5. mod gibt den Rest einer solchen Rechnung wieder, also 5 mod 2 wäre 1. mod hat eine unglaubliche Macht. Wenn bei einer Rechnung x mod y das Ergebnis 0 ist, können wir sicher gehen, dass x ein Vielfaches von y ist. Mit x mod 2 lässt sich übrigens untersuchen, ob x eine gerade oder ungerade Zahl ist.
      Shoba arbeitete mit diesem Trick und einer interessanten Methode, sich die Bit-Operatoren zu sparen:

      GML-Quellcode

      1. return ((argument0 div power(2,argument1-1)) mod 2);

      Durch die Integer-Division (div) mit der um 1 kleineren Zweierpotenz der zu untersuchenden Stelle verschiebt er wie Agnahim bei seinem ersten Anlauf die Binärstellen nach rechts; allerdings ohne >> zu benutzen. Mathematisch sicherlich sehr gut gedacht, aber ein Blick in die Hilfe-Datei hätte da wohl einige Kopfschmerzen vermieden. :D
      Jetzt kommen wir auch endlich zu dem mod 2, dass bereits bei Agnahims erster Lösung auftauchte:
      Warum muss die Zahl dahingehend überprüft werden, ob sie gerade oder ungerade ist? Der Grund dafür lässt sich mit einem Beispiel deutlich machen. Nach dem ersten Teil der Rechnung wäre bei 10(binär) und der Frage nach der ersten Stelle das Ergebnis 2/1, also 2. Obwohl 1 in der Zahl vorkommt (was bei 1 ja immer der Fall ist), ist seine eigene Stelle mit einer 0 versehen.
      Gleiches ließe sich bei 100(binär) und 2 beobachten. Allerdings merkt man nach mehreren Testdurchläufen, dass in so einem Fall die Zahl immer zweimal oder öfters vorkommt. bei 10(binär) kommt die 1 zweimal vor, bei 1(binär) würde sie aber nur einmal vorkommen. Bei 110 (also 6) würde sie gleich sechsmal vorkommen. Schon etwas bemerkt? Immer wenn die eigene Stelle nicht 1 ist, dann kommt die Zahl gar nicht oder in einer geraden Anzahl vor (bei 1 wäre das 2,4,6,8 und so weiter). Wäre die eigene Stelle aber (auch) 1, wäre die Anzahl der Vorkommnisse dadurch automatisch ungerade. mod 2 analysiert diesen Aspekt. Wenn die Zahl durch 2 teilbar ist, also gerade ist, wird false wiedergegeben, da die eigene Stelle im Binär dann unmöglich mit einer 1 versehen sein kann. Bei einer Integer-Division mit 2 kann der Rest maximal 1 betragen, also haben wir direkt einen Wiedergabe-fähigen Wert. Das ist jetzt aber wirklich genial.
      Wir haben nun bereits Lösungen gesehen, die mit einer Verschiebung (Shoba, Agna1) oder einem Vergleich arbeiteten (Wa+box, Agna3). Jürgen, der als erste einen Einzeiler präsentierte, schaffte es auf diese Variante:

      GML-Quellcode

      1. return (argument0 & argument1) div argument1;

      Den ersten Teil kennen wir bereits. Anstatt jetzt aber mit && oder > zu arbeiten hat Jürgen eine dritte Möglichkeit gefunden, die den anderen durchaus ebenbürtig ist: Die Integer-Division. Wie wir bereits wissen, hat das Ergebnis von (argument0 & argument1) nur an einer Stelle eine 1. Dass die gesuchte Zahl mehrfach auftaucht, ist also ausgeschlossen. Entweder sie tritt einmal oder keinmal auf. div kann daher auch nur 0 oder 1 wiedergeben, und liefert damit direkt eine wahr/falsch Aussage, ebenso wie mod 2 bei der Verschiebung.
      Nun folgt die letzte Lösung. Sie kann sich nicht damit rühmen, die genialste zu sein, aber sie hat doch eine Besonderheit: Sie verwendet keine Bit-Operatoren oder GM-Funktionen. Es handelt sich um die Musterlösung, die ich beim Eröffnen des Wettbewerbs bereits als Referenz in den Händen hielt (Agnahims zweite Lösung ist identisch mit dieser):

      GML-Quellcode

      1. return (argument0 div argument1) mod 2;

      Den letzten Teil kennen wir schon. Daraus können wir folgern, dass der erste Teil eine weitere Form der Verschiebung ist. Die ganzzahlige Division überprüft, wie oft argument1 in argument 0 "hineinpasst". Vorhin haben wir bereits erleutert, wann wir eine gerades und wann ein ungerades Vorkommen von argument1 erwarten können. mod 2 prüft dies dann wie gehabt. Mathematisch gesehen hat diese Lösung, abgesehen von Shobas, am wenigsten mit einer binären Anschauung zu tun, da keine binären Operatoren verwendet werden. Sie hat deshalb ihren ganz gewissen Charme. ^^
      Ich hoffe, alle haben diese Ausführungen verstanden. Wenn nicht, fragt. Jetzt aber ersteinmal die Gewinner.

      Gewinner
      Tja, soviele Einzeiler habe ich ehrlich gesagt nicht erwartet. Wenn man boxxar und WA ausschließt, gibt es drei Gewinner:
      Jürgen, Agnahim und Shoba.
      Wenn ich diese in eine Reihenfolge bringen müsste, hätte ich meine Schwierigkeiten - außer der Zeilenanzahl habe ich wenige Entscheidungskriterien aufgezählt. Wenn wir diesen Aspekt aber einmal ignorieren, muss ich Jürgen anrechnen, dass er am schnellsten einen Einzeiler präsentierte, den er über die Woche Stück für Stück verfeinerte. Agnahim hingegen lieferte gleich drei Lösungen im Verlauf der Woche, von denen jede aus einer einfachen Sichtweise als "optimal" angesehen werden kann. Shoba fällt nur in sofern hinter den beiden zurück, weil er eine GM-Funktion benutzte (log2).
      So einen Vergleich habe ich allerdings nicht anegkündigt und werde ihn deshalb auch nicht offiziell anwenden. In sofern sind diese drei die Gewinner des Wettbewerbs. Ob da noch eine kleine Überraschung rausspringt, muss ich noch mit WIN und Windapple abklären.
      Aber auch die Nicht-Einzeiler verdienen ein Lob. Namentlich werde ich sie aber nicht erwähnen, damit keiner auf die Idee kommt, dass andere, die sich entschieden haben, diesen Wettbewerb zu bestreiten, es schließlich nicht geschafft haben. Die anderen können sich nach dieser Dokumentation aber selber in die Kategorien "Konvertierung zu String" oder "Stellenabzählung durch Schleife" zählen. Alle, die ein funktionierendes Skript geschrieben haben, können sich dennoch bedenkenlos als Gewinner betrachten. Vielleicht nicht als Genies in diesem einen Fall, aber als Angehörige einer klar denkenden Minderheit. Glückwunsch auch an die!
      Selbstverständlich kann sich jeder, der absichtlich nicht genannt wurde, noch selber zu seiner Lösung bekennen.

      Anwendung
      Viele haben gefragt, was dieses Skript eigentlich effektiv bringen soll. Ich nehme einfach meine persönliche Anwendung als Beispiel:
      Früher oder später reichen die normalen Tasten-Events des GMs nicht mehr aus, komplizierte Bewegungen zu organisieren. Dies passiert ganz schnell, wenn zwei gleichzeitig gedrückte Tasten eine Funktion ausschließen müssen, die eine der beiden Tasten alleine wahrnehmen würde (diagonales Laufen mit einer eigenen Animation als einfaches Beispiel).
      Dies lässt sich in einem Step-Event mit keyboard_check einfach bewerkstelligen. Für press und release stehen uns auch Funktionen zur Verfügung.
      Jetzt kommt aber der Knackpunkt: Was ist, wenn wir zwei Eingabe-Möglichkeiten haben, also Mehrfachtastenbelegung (durch ein GamePad z.B.)? Dann könnte es passieren, dass eine Taste 2mal hintereinander "pressed" bevor sie "released" wird. Dies kann zu ungewollten Folgen führen. Das Problem ließe sich lösen, indem man zu Beginn eines Steps alle Tasten abfragt und in Variablen speichert, wodurch man ein doppeltes Drücken entschärft (released wird z.B. nur gegeben, wenn die letzte Taste mit der gleichen Funktion losgelassen wird; bei pressed wäre es nur die erste). Nun wiederum müssen wir aber mit kleinen if-Monster kämpfen und vielen Variablen kämpfen, und das bei nur 4 Möglichkeiten pro Tasten-Funktion: Drücken, Halten, Loslassen und Ruhen. Nun bin ich auf die Idee gekommen, ersteinmal nur zwischen gedrückt und nicht gedrückt zu unterscheiden, und dies in einer Variable zu speichern, wobei jeder Tasten-Funktion eine Binärstelle zugewiesen wird. Wenn ich nun diese Variable mit der aus dem letzten Step so vergleiche...

      GML-Quellcode

      1. mixture = current^previous;
      2. //mixture setzt 1 für eine Veränderung an der jeweiligen Binärstelle
      3. released = mixture&previous;
      4. pressed = mixture&current;

      ...erhalte ich Informationen über pressed und released. Der Operator ^ liefert im Ergebnis eine 1, wenn die beiden Zahlen sich an dieser Binärstelle unterscheiden. Sonst liefter er 0. Wenn wir diese Mixtur, die also alle Veränderungen aufgezeichnet hat, mit dem jetzigen vergleichen (bitweises und &), dann erhalten wir alle neu hinzugekommenden Tasten, denn die Stellen müssen davor ja 0 gewesen sein, eine Veränderung wäre ja nur nach 1 möglich. Im Umkehrschluss lieftert uns ein ein &-Vergleich mit dem letzten Tastenwert alle Tasten, die seit dem aktuellen Step nicht mehr gedrückt, also losgelassen wurden.
      Nach dieser Berechnung der gehaltenen, gedrückten und losgelassen Tasten können wir nun mit binary_check die einzelnen Positionen abfragen, die jeweils einer Tasten-Funktion zugeschrieben sind.
      Aber moment, es gibt noch einen Vorteil: Dieser Tastenwert muss nicht unbedingt durch Spielereingaben gebildet werden. Er kann auch aus einer Datei ausgelesen werden oder von einer KI erstellt werden. Damit ließe sich mit nur einer Variable pro Step z.B. ein Replay machen oder eine KI, die Figuren wie ein Spieler steuert, ohne dass deren Code an andere Stelle verändert werden muss. Bei einem Prügelspiel müsste man also nur die Art der Eingabe wählen. Bei CPU generiert der Game Maker anhand von Beobachtungen diesen Tasten-Wert, sonst macht es ein Spieler über Tastatur und Gamepad. Genial? Ich hoffe doch... ^^
      Soviel zum möglichen Einsatz. Dies ginge zwar auch mit vielen Variablen, allerdings bietet es so mehr Vorteile: Nur eine Variable und wenige Zeilen Code.

      Ich hoffe, ihr könnt damit etwas anfangen. Jetzt ist aus dem Wettbewerb ein Tut für Fortgeschrittene geworden, so soll es sein. Postet fleißig Feedback. Bis zum nächsten Contest. ;)

      MewX
    • Erstmal großen Lob an alle Teilnehmer und besodners an die Gewinner, die einen Einzeiler hervorgebrahct haben und auch an MewX der dies alles organisiert hat und sich dei Zeit für eine solche Rückmeldung genommen hat!
      Ich hatte in letzter Zeit kaum Zeit, sodass ich bei diesem Wettbewerb nicht mitgemacht habe und mir auch keine Gedanken über einen möglichen Lösungsweg geamcht habe... nun bereue ich es!^^
      Würde zugern wissen was ich hervorgebracht hätte... wahrscheinlich nen 200 Zeiler! XD
      Ich denk nun mal gerne um 50 Ecken rum ;)

      War aufjedenfall ziemlich interessant dieser Technikcontest und auch sehr lehrreich!
      Hoffe das es in zukunft mehr von solchen Technikkconests geben wird!
    • Ich finde diesen Contest eine gute Idee, obwohl man daraus mehr machen könnte. Man könnte es so gestalten, dass keine Einzeiler möglich sind, und somit eine grössere Herausforderung bestünde, weniger Zeilen zu brauchen als die anderen.

      Dragoon

      PS: Ich hätte noch eine andere Lösung :D:

      GML-Quellcode

      1. return sign(argument0&argument1);
      int (*x(*x(int))[5])(int*);
      Confused? Yes, it's C!
    • :D
      Ich hab mir schon gedacht: was macht der MewX eigentlich so lange. ;)
      Aber nach der ausführlichen Analyse, weis ich schon was da so lange gedauert hat.
      War wirklich ein netter contest, nicht nur weil ich mit gewonnen habe, sondern weil ich dabei auch noch was lernen konnte.
      Mit Dragoons Lösung sind's jetzt 7 verschiedene Einzeiler, die alle das gleiche Ergebnis ausspucken. Das hätte ich nicht erwartet, dass man das auf so viele verschiedene Arten lösen kann.

      Also meinen Glückwunsch an alle Gewinner. :D

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Jürgen ()

    • auch meinen glückwunsch an die gewinner :D
      meiner einer ist ja nicht so gut in mathe und hat erstmal eine binärzahl gebastelt, welche dann umständlich untersucht wird. auch wenn ich nicht alle lösungen schnalle, finde ich klasse, was so an einzeilern entstanden sind.
      Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
      GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
    • Ich bin alter PHPler, habe das Problem also in PHP angegangen, und da sah meine lösung wie folgt aus:

      Quellcode

      1. function binary_check($value, $pos) {
      2. return $value & $pos ? true : false;
      3. }


      Das lässt sich so zwar nicht in den GM bringen, aber der Ansatz mit dem Binaräm UND habe ich angewendet. Das ? und das : sind ein operator (ein ternärer Operator, sprich er hat 3 Operanten) der eine Fallunterscheidung darstellt:

      Quellcode

      1. statement ? true : false

      Wobei true zurückgegeben wird wenn das statement erfüllt ist, ansonsten false. Bzw werden die funktionen/operatoren von true oder false ausgeführt und das jeweilige zurückgegeben. GM kennt diesen Operatoren faik nicht, also bin ich auf IF zurückgegangen. Dass > und && ja gehen ist mir so gar nicht aufgefallen.
      Eine Anmerkung meinerseits: Die kürzeste Lösung ist nicht immer die beste ;-)
      Also nicht denken das ihr schlechte Programmierer seit nur weil eure Codes lang sind
    • Erstmal natürlich Glückwunsch an die Gewinner!
      Mir war schon recht früh klar dass ich nicht bei den gewinnern dabei sein werden, aber egal :D Hat auf jeden Fall spaß gemacht mitzumachen. Auf die Einzeiler Lösung bin ich nicht gekommen, da ich noch nie etwas mit binären operatoren gemacht hab und keine erfahrung damit habe, deshalb kapiere ich die lösungen der gewinner auch größtenteils nicht und hab das ganze eben mit einer schleife gelöst^^
      Auf Agnahims Bitte, alle vorschläge zu veröffentlichen, poste ich hier jetzt mal meinen:

      GML-Quellcode

      1. pos=1;
      2. while(argument0>0){
      3. if(pos==argument1)
      4. return argument0 mod 2;
      5. argument0=argument0 div 2;
      6. pos*=2;
      7. }
      “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

      Ich schreibe mit Neo.
    • Ein kleine Idee(die aber zu viel Aufwand bräuchte, denk ich mal...):
      Eine Art Olympiade! Dann gibt es zum Beispiel folgende Diziplinen( • sind Ideen die, wenn überhaupt, dabei sein sollten, + für kleine unnötige Sahnehäubchen):
      Absolut:
      • Skripten (wie hierbei)
      + Einfaches Darstellen (Eine Figur/Landschaft wird beschrieben, die Teilnehmer müssen sie mit möglichst wenigen untransperenten Pixeln und Farben darstellen[vorgegebende Gesamtgröße!])
      Relativ/Subjektiv:
      • Pixeln (Eine Figur/Landschaft wird beschrieben, die Teilnehmer müssen es möglichst schön gestalten[vorgegebende Größe!])
      • Sound (Ereignis wird beschrieben/gemalt, dazu bestpassendstee Sounds machen)
      + Musik (Szene wird beschrieben/gemalt, dazu bestpassendste, schöne Hintergrundmusik machen)

      So jedes Jahr könnte man das machen... ist halt nur sauviel Aufwand, vor allem wegen den subjektiven Fächern. Was meint ihr dazu?

      P.S.: Gehört das jetzt in gm-d Allgemein?

      P.P.S.: Das mit dem Technik-Contest war schonmal toll, nur leider habe ich mich noch nie mit dem binary von GameMaker beschäftigt und somit keine Chance gehabt ;)

    • Glückwunsch an die Gewinner! Echt tolle Lösungen, da wäre ich so schnell nie draufgekommen. Da hätte ich mich mal hinsetzen sollen und das ganze etwas genauer durchdenken sollen. Meine Lösung arbeitete übrigens mit einer Schleife, einem Zweier-Logarithmus, einer if-Abfrage und einem power- und floor-Befehl. Abgesehen davon, dass das wohl die umständlichste Methode war, weiß ich nichtmal ob das überhaupt für alle Möglichkeiten funktioniert hätte bzw. der Aufgabe überhaupt gerecht wurde.
      Einige meiner Spiele: