Programmierwettbewerb: JSDash

    UPDATE: Der Wettbewerb ist beendet. Die Ergebnisse .

    Das Unternehmen Hola kündigt die lang erwartete Sommer Programmierwettbewerb! Gewinner werden Preise erwartet:

    1. Erster Platz: 3000 USD.
    2. Zweiter Platz: 2000 USD.
    3. Dritter Platz: 1000 USD.
    4. Wenn Sie jemandem einen Link zu diesem Wettbewerb senden, indem Sie unsere Adresse in CC eintragen, und dieser nimmt den Preis entgegen, erhalten Sie die Hälfte des Preises (natürlich nicht zum Nachteil des Siegerpreises). Für einen Gewinner kann nur eine Person eine solche Belohnung erhalten - die Person, die den Link zuerst gesendet hat.

    Autoren mit interessanten Entscheidungen werden zu Interviews eingeladen.



    Die Regeln



    Die Teilnahmebedingungen in englischer Sprache sind auf GitHub verfügbar . Unten ist eine Übersetzung ins Russische.

    • Reichen Sie Lösungen mit diesem Formular ein . Es werden keine Entscheidungen per E-Mail getroffen.
    • Entscheidungen werden bis zum 17. August 2017 , 23:59:59 UTC getroffen.
    • Die vorläufigen Ergebnisse werden am 24. August 2017 veröffentlicht und die endgültige Bekanntgabe der Gewinner erfolgt am 31. August 2017 .
    • Sie können Entscheidungen mehrmals senden, aber von jedem Teilnehmer wird nur die letzte Entscheidung berücksichtigt, die vor Ablauf der Frist für die Annahme der Arbeit gesendet wurde.
    • Zum Testen verwenden wir Node.js v8.1.3 (die zum Zeitpunkt der Veröffentlichung aktuelle Version). In der Standardkonfiguration können Sie alle vom Interpreter unterstützten Sprachfunktionen verwenden.
    • Alle Lösungen sollten im Code sein in der JS einer einzigen Datei .
    • Die Lösung sollte auf JS sein. Wenn Sie CoffeeScript oder ähnliche Sprachen bevorzugen, müssen Sie die Lösung vor dem Absenden in JS übersetzen.
    • Wenn Ihre JS-Datei aus anderen Sprachen wie CoffeeScript erstellt, minimiert und / oder kompiliert wurde, fügen Sie bitte ein Archiv mit Quellcodes sowie vorzugsweise eine Beschreibung des Ansatzes bei. Der Inhalt dieses Archivs wird veröffentlicht, aber nicht getestet.
    • Sie können keine Module laden , auch nicht die, die in der Standarddatei Node.js enthalten sind.
    • Wir müssen Ihren vollständigen Namen kennen, aber wenn Sie möchten, veröffentlichen wir stattdessen einen Alias. Wir werden Ihre E-Mail-Adresse vertraulich behandeln.
    • Stellen Sie Fragen zum Zustand der Aufgabe in den Kommentaren zu dieser Publikation oder per E-Mail .

    Jsdash


    Lass uns ein Textspiel spielen! Zweifellos erkennen Sie darin einen Klon des klassischen Videospiels, das erstmals 1984 veröffentlicht wurde.

    Ihr Ziel ist es, künstliche Intelligenz zu schreiben, die dieses Spiel spielt und Entscheidungen anstelle von Menschen trifft. Das Spiel findet in Echtzeit statt und Ihr Skript hat so viel Zeit, um Entscheidungen zu treffen wie eine Person.

    Wir empfehlen, dass Sie das Skript game / jsdash.js ausführen und das Spiel mehrmals spielen, bevor Sie weiterlesen . (Hinweis: Wir haben das Spiel unter xterm unter Linux entwickelt und getestet. Auf anderen Systemen funktioniert es möglicherweise oder auch nicht.)

    Das Spiel


    Die Pfeiltasten können in vier Richtungen navigiert werden. Der grüne Buchstabe Abist du. Sie können sich durch den leeren Raum oder die Erde bewegen ( :), Steine ​​( O) horizontal in den leeren Raum schieben und Diamanten sammeln ( *). Durch Brick ( +) und Stahl ( #) kann nicht passieren. Steine ​​und Diamanten fallen, wenn sie ohne Unterstützung bleiben, und rollen auch seitlich voneinander und von Ziegeln ab. Fallende Gegenstände töten den Spieler. Schmetterlinge (Animation /|\-) explodieren im Kontakt mit dem Spieler, weil sie auf einen fallenden Gegenstand treffen oder ohne die Möglichkeit einer Bewegung blockiert werden. Eine Schmetterlingsexplosion absorbiert jedes andere Material als Stahl und kann einen Spieler töten. Nach der Explosion bilden sich Diamanten, die gesammelt werden können.

    Für jeden gewonnenen Diamanten wird 1 Punkt vergeben. Wenn Sie 3 Diamanten in Abständen von weniger als 2 Sekunden sammeln, werden zusätzlich zu den Punkten für jeden von ihnen 3 Preispunkte vergeben. Wenn Sie weiterhin schnell Diamanten sammeln, ohne Intervalle von 2 Sekunden oder länger einzuhalten, erhalten Sie 5 Punkte nach dem fünften Diamanten, 7 Punkte nach dem siebten (zusätzlich zu allen vorherigen Boni) und so weiter für jede Primzahl. Für einen getöteten Schmetterling werden 10 Punkte vergeben, sofern der Spieler nicht durch eine Explosion getötet wurde.

    Das Zeitlimit für das Spiel beträgt 2 Minuten. Sie können das Spiel früher unterbrechen, indem Sie Q, Esc oder Strg-C drücken. erzielte Punkte gehen nicht verloren. Mit der P-Taste können Sie das Spiel anhalten.

    Die verbleibende Zeit, Punkte und Meldungen zu Preisströmen (Hot Streak) werden in der Statusleiste unter dem Spielfeld angezeigt.

    Die Mechanik unseres Spiels als Ganzes entspricht dem Modell von 1984 (es ist bekannt für seine detaillierte Beschreibung auf der Boulder Dash-Fanseite ), aber der Einfachheit halber haben wir uns entschieden, nicht alle Arten von Objekten zu verwenden. Die größten Unterschiede sind das oben beschriebene Punktesystem und die Tatsache, dass es auf dem Level keinen Ausweg gibt. Das Ziel des Spiels ist es, so viele Punkte wie möglich zu erzielen, bevor das Spiel mit dem Tod eines Charakters endet oder nachdem eine Zeit vergangen ist. Wenn Sie in den Details der Spielmechanik interessiert sind, lesen Sie den Modul - Code Quelle game.js .

    Lösungen


    Die Lösung ist ein Node.js-Modul ohne Abhängigkeiten. Das Modul muss eine Funktion exportieren:
    play(screen)
    

    Das Spiel lädt das Modul und ruft die Funktion playeinmal auf, wobei der Anfangszustand des Spiels als Parameter übergeben wird screen. Es ist ein Array von Zeilen, eine für jede Zeile des Bildschirms von oben nach unten, einschließlich der Statusleiste. Die Linien enthalten genau das, was Sie auf dem Bildschirm sehen, nur ohne ANSI-Farben einzufärben (das Spiel kann in diesem Modus auf der Konsole angezeigt werden, wenn Sie es mit dem Parameter ausführen --no-color). Die Funktion playmuss ein Generator sein. Um einen Zug zu machen, muss sie erzeugt (Ausbeute) Wert 'u', 'd', 'r'oder 'l'Schritt nach oben, unten, rechts oder links, respectively. Sie können auch generieren'q'oder schalten Sie einfach den Generator aus (Zurück), um das Spiel vorzeitig zu beenden (die gewonnenen Punkte gehen nicht verloren). Wenn Sie einen anderen Wert generieren, bedeutet dies, dass Sie an Ort und Stelle bleiben. Der Versuch, in eine Richtung zu gehen, in die es unmöglich ist, sich zu bewegen (zum Beispiel in eine Wand), ist nicht verboten: Der Charakter bleibt einfach an Ort und Stelle. Nach jeder Ausbeute wird der Inhalt des Arrays screenaktualisiert, und Ihr Code kann ihn erneut analysieren, um weitere Entscheidungen zu treffen.

    Wenn Ihre Funktion eine Ausnahme auslöst, endet das Spiel mit einer Punktzahl von 0 Punkten. Dies hindert Ihr Programm nicht daran, auf anderen Ebenen zu spielen und Punkte zu sammeln.

    Ihr Skript wird in einem separaten Prozess ausgeführt. Selbst wenn es einfriert, wird das Spiel dadurch nicht verlangsamt (der Charakter bleibt an Ort und Stelle).

    Der Spielstatus wird alle 100 ms aktualisiert. Wenn die Funktion playBefehle schneller generiert, bewegt sich der Charakter 10 Mal pro Sekunde. Nach jedem Befehl wird der Generator auf Anweisung yieldbis zum Ende der 100 ms langen Runde gesperrt . Wenn die Funktion länger als 100 ms über einen Zug nachdenkt, werden die Züge übersprungen, und der Charakter bleibt in den Runden an Ort und Stelle, in denen es der Funktion nicht gelungen ist, einen Zug auszuführen. In diesem Fall sieht der Generator auch einige Zwischenzustände des Bildschirms nicht. Zum Beispiel, wenn ein Skript 250 ms zwischen zwei Anweisungen „nachdenkt“yieldDann sieht er keine zwei Zustände auf dem Bildschirm, aber der Charakter bleibt zwei Runden lang unbeweglich. Somit würden zwei Gelegenheiten, einen Schritt zu tun, der wäre, wenn das Programm schneller arbeiten würde, verpasst. Danach wird der Generator für 50 ms bis zum Ende der Runde gesperrt und der von ihm erzeugte Befehl ausgeführt.

    Ein sehr einfaches Beispiel für ein funktionierendes Skript für künstliche Intelligenz finden Sie in der Datei game / example.js . In jeder Runde findet er alle möglichen Züge (Richtungen, in denen sich neben der Position des Spielers ein leerer Raum befindet, Erde, ein Stein, der bewegt werden kann, oder ein Diamant) und wählt zufällig einen aus. Normalerweise wird dieses Skript kurz nach dem Start des Spiels beendet.

    Testen


    Das Skript jsdash.js, das wir auf GitHub bereitstellen, ist nicht nur ein interaktives Spiel, sondern auch ein leistungsstarkes Testwerkzeug . Führen Sie es mit einem Parameter --helpaus, um alle Funktionen herauszufinden.

    Jede an uns gesendete Lösung wird mindestens bei 20 automatisch generierten Levels gestartet. Der Teilnehmer, dessen Entscheidung auf allen Ebenen die meisten Punkte bringt, wird als Sieger anerkannt. Wir behalten uns das Recht vor, die Anzahl der Levels (für alle Teilnehmer) zu erhöhen, falls erforderlich, um ein "Unentschieden" zwischen den Leitern auszuschließen. Wenn dies nicht hilft, gewinnt derjenige, der seine Entscheidung früher gesendet hat.

    Beim Testen jeder Lösung wird für den Pseudozufallszahlengenerator derselbe Satz von Startwerten verwendet, sodass die Programme aller Teilnehmer die gleichen Stufen erhalten. Beim Starten Ihrer Lösungen werden die Standardeinstellungen verwendet:

    jsdash.js --ai=submission.js --log=log.json --seed=N
    

    Es wird jedoch empfohlen, dass Sie auf alle verfügbaren Befehlszeilenoptionen achten, die Ihnen beim Debuggen helfen können.

    Am Ende des Wettbewerbs werden die Aufzeichnungen der Spiele jeder Lösung auf jeder Teststufe veröffentlicht. Diese Datensätze können mit diesem Befehl wiedergegeben werden:

    jsdash.js --replay=log.json
    

    Das Testen aller Lösungen findet auf dem virtuellen c3.large- Server (siehe Hardwarespezifikationen hier) auf Amazon AWS unter Ubuntu 14.04 (amd64) statt. Die Lösungen werden nacheinander getestet, ohne dass die Maschine anderweitig belastet wird.

    Wir beheben Fehler im Testskript, über die uns die Teilnehmer berichten. Bleiben Sie für Updates auf die Datei abgestimmt Spiel / CHANGELOG.md !

    Lösungen einreichen


    Verwenden Sie zur Einreichung von Entscheidungen das Formular auf unserer Website . Es werden keine Entscheidungen per E-Mail getroffen!

    Da der Lösungscode häufig generiert, minimiert oder aus einer anderen Sprache übersetzt wird, enthält das Formular auch ein Feld zum Senden eines Archivs mit Quelltests. Wenn der Code generiert wird, schalten Sie den Generator ein. Wenn minimiert, aktivieren Sie die Originalversion. Wenn der Code aus CoffeeScript oder einer anderen Sprache übersetzt wurde, geben Sie den Code in der Sprache an, in der er geschrieben wurde. Es ist auch ratsam, eine README-Datei mit einer kurzen Beschreibung des Lösungsansatzes (in englischer Sprache) in das Archiv aufzunehmen. Das Archiv sollte im Format tar.gz, tar.bz2 oder zip vorliegen. Der Inhalt des Archivs wird veröffentlicht, aber nicht getestet (wir testen nur die JS-Datei, die Sie außerhalb des Archivs senden).

    Die maximale Größe der JS-Datei beträgt 64 MiB. Dies ist eine willkürlich gewählte Figur, die hauptsächlich existiert, damit jemandes "Lösung" die Scheibe für uns nicht sofort füllt. Wenn Ihre Lösung wirklich mehr als 64 MiB beträgt, schreiben Sie uns und wir werden das Limit erhöhen.

    Wenn Sie Fragen zu den Bedingungen des Problems oder zu Problemen beim Senden der Lösung haben, schreiben Sie bitte einen Kommentar oder einen Brief .

    Viel Glück an alle Teilnehmer!

    Jetzt auch beliebt: