Ostereiersuche
Bot finden Ei vor Hase finden Ei. Bot glücklich.
Überblick
Dies ist eine echte Herausforderung zu Ehren von Ostern und der Osterei-Jagdtradition!
Ihr Bot hat eine Vision von zwei Räumen in jeder Richtung, einschließlich Diagonalen, wodurch ein 5x5-Quadrat um Sie herum entsteht, das Sie sehen können. Es sucht nach Eiern, und wer die meisten Eier findet, gewinnt!
Die Tafel
Das Brett besteht aus o
s, die Ostereier sind, #
s, die Wände sind, *
s, die andere Spieler sind, und s, die leere Räume sind.
- Es wird ein Quadrat mit Kantenlänge sein
(number of entries) * 3
. - Es wird von Mauern umgeben sein.
- Innerhalb der Wände befindet sich eine Auswahl zufällig platzierter, gerader Wände von
#
, die eine zufällige Länge zwischen 2 und 10 einschließlich haben. Es wird(number of entries) * 3
von ihnen sein. - Die Eier werden dann zufällig platziert. Es wird
(number of entries) * 4
von ihnen geben, und sie werden nur auf leeren () Feldern generiert .
- Es müssen mindestens 7 Elemente vorhanden sein, damit der Board-Generierungsprozess ordnungsgemäß funktioniert.
Hier ist eine JSFiddle, die ein zufälliges Board generiert , mit dem Sie testen können. Hier ist ein Beispiel mit (number of entries) = 7
:
#####################
# o ##
# # o ##
# #o ###### ##
###### # ##
## o # # ##
## o# #o# o o##
## #o # # o # #
## # o # # # #
## ## # # o # #
## # # o # # #
## # o # ## # # #
## # # # #
# o # ## # #
# o oo ##o #
#o ####### oo ## #
# # # #
# o o o# #
# o #### o o#
# #
#####################
Nachdem das Brett generiert wurde, wird jeder Spieler auf ein zufälliges Feld (leeres Feld) gelegt.
Eingang
Sie werden sechs Eingabezeilen nehmen. Die ersten fünf Zeilen sind Ihr Sichtfeld (Felder außerhalb der Grenzen der Tafel werden durch dargestellt X
, und das mittlere Feld ist immer *
Sie selbst), und die sechste Zeile ist (zunächst) leer.
Ausgabe
Sie werden drei Zeilen ausgeben. Zunächst die Richtung, in die Sie sich bewegen möchten:
1 2 3
8 YOU 4
7 6 5
(9 ist ein No-Op, wenn Sie sich nicht bewegen möchten), zweitens eine von A
Tack, C
Counter oder N
etwas anderem (dies wird in Kürze näher erläutert), und die dritte Zeile ist eine beliebige Zeichenfolge mit einer Länge von bis zu 1024 Dies wird das Gedächtnis Ihres Bots sein. Sie können es für beliebige Zwecke verwenden oder leer lassen. Dieser Speicher ist dann die sechste Eingabezeile für Ihr Programm bei der nächsten Ausführung.
Alle weiteren Ausgabezeilen werden ignoriert, und wenn nur eine Zeile vorhanden ist, wird angenommen, dass die zweite leer ist.
Ziehen um
Der folgende Prozess wird verwendet, um festzustellen, wo Sie umgezogen sind:
- Wenn Sie sich bei
Ihrem Umzug in ein leeres Feld begeben ( ), wird Ihr Spieler in dieses Feld gestellt.
- Wenn Sie in einer Mauer landen (
#
), wird Ihr Zug ignoriert und Sie verlieren Ihren Zug. - Wenn Sie in einem Ei (
o
) oder auf einem Spieler (*
) landen , werden diese Informationen gespeichert und verwendet, nachdem alle umgezogen sind.
Nachdem alle umgezogen sind, werden Unklarheiten gelöst.
Wenn zwei Spieler auf dem gleichen Feld gelandet sind, kommt es zu einem Kampf! Hier wird die A
/ C
/ N
um Spiel kommt. A
ttack schlägt etwas N
anderes (normaler Angriff), N
ttack schlägt etwas C
anderes (man kann nichts kontern) und C
ttack schlägt etwas A
anderes (Gegenangriff). Der Spieler, der diesen Kampf gewinnt, bleibt auf seinem Feld und der Spieler, der verliert, kehrt zu dem ursprünglichen Feld zurück, auf dem er begonnen hat. Bei einem Unentschieden kehren beide Spieler zu ihrem ursprünglichen Standort zurück.
Wenn ein verlierender oder gebundener Spieler zu seinem ursprünglichen Platz zurückkehrt und dort ein anderer Spieler ist, gibt es keinen Kampf und der andere Spieler kehrt ebenfalls zu seinem ursprünglichen Platz zurück. Wenn dieses Feld einen anderen Spieler hat , geht dieser zurück und dies wird fortgesetzt, bis sich alle Spieler in verschiedenen Feldern befinden.
Wenn sich drei oder mehr Spieler auf einem Feld befinden, kehren alle zu ihren ursprünglichen Positionen zurück.
Wenn noch ein Spieler auf einem Ei steht ...
- Wenn der Spieler wählt
A
, wird das Ei zerstört. - Wenn der Spieler gewählt hat
C
, passiert nichts und der Spieler kehrt zu seinem ursprünglichen Platz zurück. - Wenn der Spieler gewählt hat
N
, nimmt der Spieler das Ei auf! Die Punktzahl des Spielers wird um eins erhöht und das Ei wird entfernt.
Sprachen
Sie können jede Sprache verwenden, die unter Windows, OSX und Linux frei verfügbar ist, um die Fairness zwischen den Teilnehmern zu gewährleisten. Wenn der Code nicht frei ausführbar ist, sondern kompiliert oder in ein Format gepackt werden kann, geben Sie dies bitte auch in Ihrer Antwort an. Wenn Sie Ihren Code in einer allgemeineren Sprache (z. B. CoffeeScript -> JavaScript) kompilieren können, tun Sie dies im Idealfall.
Wertung
Ihre Punktzahl ist die durchschnittliche Anzahl von Eiern, die Sie in zehn Läufen sammeln. Ein Lauf endet, wenn alle Eier eingesammelt sind oder die (number of entries * 25)
Züge abgelaufen sind. Ich werde manuell sicherstellen, dass es möglich ist, alle Eier für jede Karte zu erreichen (indem kontinuierlich Karten erstellt werden, bis alle Eier erreichbar sind).
Anzeigetafel
Eine Anzeigetafel wird hinzugefügt, wenn alle folgenden Bedingungen erfüllt sind:
- Es wurden mindestens sieben gültige Beiträge mit einer positiven oder Null-Punktzahl (nicht herabgestuft) eingereicht
- Mindestens 48 Stunden sind vergangen, seit diese Herausforderung erstellt wurde (UTC 14:23)
Die Regeln werden während dieser Vorwettbewerbsperiode nicht geändert, es sei denn, es wurde klargestellt, wo eine Regel unklar war. Sobald die Anzeigetafel erstellt ist, wird auch das Testprogramm hier veröffentlicht, damit Sie Ihre Eingaben testen können. Der Testcode dafür ist noch in Arbeit, aber er kann abgespielt werden und funktioniert. Hier ist das GitHub-Repo.
quelle
9
, kann er niemals sinnvoll angegriffen werden. Wenn ein anderer Spieler (B) das Feld dieses Spielers betritt und gewinnt, wird A auf das ursprüngliche Feld (das das gleiche ist) zurückgesetzt. Aber jetzt gibt es einen Konflikt, weil sowohl A als auch B da sind, also muss B zu seinem eigenen Feld zurückkehren. Das Ergebnis ist also unabhängig vom eigentlichen Kampf, B geht immer zum Ausgangsquadrat zurück und A bleibt immer gesetzt. Das würde mir erlauben, beides zu schreiben, was einem anderen Beitrag helfen könnte, indem ein Pfad für alle anderen blockiert wird.Antworten:
Cart'o'Gophers
Hier ist eine weitere Einreichung - und diese soll tatsächlich wettbewerbsfähig sein. Wieder ist es in Ruby. Also mach mit
ruby cartogophers.rb
. Das hat viel länger gedauert als erwartet ...Dieser Bot merkt sich, was er zuvor gesehen hat und versucht, in jeder Runde eine größere Karte zu erstellen. Dann sucht es mit einer Breitensuche nach dem nächsten Ei und geht auf diese Weise voran. Wenn auf der aktuellen Karte kein Ei erreicht werden kann, bewegt sich der Bot zum nächsten offenen Rand seiner Karte (um die Karte schnell in eine Richtung zu erweitern, in die er sich noch bewegen kann).
Dieser Bot hat noch kein Konzept für andere Bots und auch keine Kampfstrategie. Da ich keinen zuverlässigen Weg gefunden habe, um festzustellen, ob mein Umzug erfolgreich war, kann dies zu Problemen führen. Ich gehe einfach immer davon aus, dass der Umzug erfolgreich war. Wenn dies nicht der Fall war, werden an den falschen Stellen neue Patches in die Karte geladen, die für die Pfadfindung möglicherweise schädlich sind oder nicht.
Der Bot verwendet den Speicher, um die Karte und ihre neue Position auf der Karte zu speichern (vorausgesetzt, die Bewegung ist erfolgreich). Die Karte wird ohne Zeilenumbrüche gespeichert, komprimiert und base64-codiert (zusammen mit der Anzahl der Zeilen der Karte, damit die Zeilenumbrüche erneut eingefügt werden können). Durch diese Komprimierung wird die Größe auf etwa ein Drittel der unkomprimierten Karte reduziert. Bei einem Schatten von über 1000 Bytes könnte ich also eine Karte mit etwa 3000 Zellen speichern, was ungefähr der vollständigen Erkundung einer Karte mit 18 Bots entspricht. Solange es nicht annähernd so viele Einreichungen gibt, kann ich mir nicht die Mühe machen, eine Lösung für diesen Fall zu finden.
Nach ein paar Testläufen gegen 5dumbbot
s und 1naivebot
(mein anderes Ergebnis) schnitt es entweder sehr schlecht ab (wie 1 oder 2 Eier) oder übertraf die anderen um einiges (7 bis 9 Eier). Ich denke vielleicht über eine bessere Kampfstrategie nach und wie ich feststellen kann, ob ich tatsächlich umgezogen bin oder nicht. Möglicherweise können beide die Punktzahl etwas verbessern.Oh und wenn du dich über den Namen des Bots wunderst, solltest du The Order of The Stick ( letztes Panel in diesem Comic ) lesen .
BEARBEITEN: Es gab einige Fehler beim Erkennen der Kanten der entdeckten Karte. Jetzt, wo ich sie repariert habe, bekommt dieser Bot immer Punkte
20
gegen 5dumbbot
s und 1naivebot
. Das ist eher so! Wenn Sie$stderr.puts map
jetzt zu meinem Bot hinzufügen , können Sie wirklich sehen, wie er die Karte systematisch aufdeckt und in der Zwischenzeit alle Eier sammelt. Ich habe auch zu wählen , entschied sichA
stattN
auf ein Ei , wenn nicht verstärkt, um die Wahrscheinlichkeit der Bewegung zurück in die ursprüngliche Zelle bot (die teilweise Schrauben auf der Karte) zu reduzieren.(Gegen 6
naivebot
s läuft es nicht ganz so gut , zumal es sehr gut möglich ist, mit einem anderen Bot in einen "Deadlock" zu geraten, wenn beide wiederholt ein Ei nehmen und wählen wollenN
. Ich muss darüber nachdenken ... )quelle
Java-Häschen
Dieses Häschen ist noch nicht erwachsen geworden (ich plane noch Änderungen), aber es ist ein Ausgangspunkt für den Moment. Er sucht nach dem nächsten Ei und geht darauf zu. Es gibt (noch) keine Wanderkennung oder Grenzüberschreitungserkennung. Er wird gehen, um das Ei aufzunehmen, auf dem er landet, aber sonst wird er versuchen, sich herumzudrücken und alles andere anzugreifen. Wenn keine Eier in der Nähe sind, folgt er dem nächsten Hasen. Sie könnten etwas wissen, was er nicht weiß. Andernfalls wählt er einfach eine zufällige Richtung zum Laufen. Und er ist ziemlich vergesslich (keine Verwendung der Speichervariable).
Pläne für die Zukunft:
Update 1 Mein Hase folgt anderen Hasen, wenn er kein Ei sieht. Außerdem wurde der Code "find next egg" in seine eigene Methode überarbeitet.
quelle
N
aiveBot (in Ruby)Hier ist ein sehr simpler Bot, um das Ei ins Rollen zu bringen (wir wollen diese 7 Einreichungen schnell treffen, oder?). Mein Ruby ist nicht sehr idiomatisch, so dass dieser Code die richtigen Rubyisten vor Schmerzen zusammenzucken lässt. Lesen Sie auf eigenes Risiko.
Laufen Sie mit
ruby naivebot.rb
.Ich codiere einfach ein paar Fälle, in denen ein Ei sichtbar ist und nicht durch eine Wand blockiert wird. Es geht nicht einmal um das nächste Ei, sondern um den ersten Schritt, der Sinn macht. Wird kein solches Ei gefunden, macht der Bot einen zufälligen Zug. Es ignoriert alle anderen Spieler und greift niemals an oder kontert.
quelle
WallFolower
(absichtliches Wortspiel) in Python 3 :
Geht zu einem Ei, wenn ein Ei in Sicht ist, aber nur, wenn es näher an diesem Ei liegt als ein anderer Roboter. Wenn es in der Ferne ein Unentschieden gibt, geht es trotzdem. Ansonsten folgt eine linke Wand (derzeit nicht gut implementiert).
Müssen noch Arbeiten an der Wand folgen, aber ich werde dies trotzdem hier posten.
quelle
sys.exit(0)
zuexit(0)
? Außerdem muss ich daran arbeiten (im Moment nimmt es an, dass es sich um ein `` handelt), aber ich habe nicht wirklich die Zeit. Wenn ich Zeit habe, werde ich kommen und das regeln.