In dieser Herausforderung musst du eine Spezies einzelliger Organismen entwerfen, um in der Petrischalen-Arena bis zum Tod zu kämpfen. Die Arena wird als rechteckiges Gitter dargestellt, wobei jede Zelle einen Raum einnimmt:
.....x....
...x...o..
...x.c..o.
.......o..
Attribute
Jede Zelle hat drei Attribute. Wenn Sie zu Beginn des Spiels Ihre Zellart angeben, weisen Sie diesen Attributen 12 Punkte zu.
- Trefferpunkte (HP): Wenn die HP einer Zelle auf Null fallen, stirbt sie. Neue Zellen haben volle HP.
- Wenn eine Zelle stirbt, hinterlässt sie eine Leiche, die von anderen Zellen zur Energiegewinnung gefressen werden kann.
- Eine Zelle kann verlorene HP nicht wiedererlangen, aber sie kann durch Teilen eine neue Zelle mit vollen HP erstellen.
- Energie : Die meisten Aktionen, die eine Zelle ausführen kann, erfordern Energie. Durch aktives Ausruhen kann eine Zelle verlorene Energie bis zum Maximum ihrer Spezies zurückgewinnen.
- Es ist wahrscheinlich, dass eine Zellart mit weniger als 5 Energie ausfällt, da sie sich nicht teilen kann, um neue Zellen zu erzeugen.
- Eine Zelle kann nicht über den Maximalwert ihrer Spezies hinaus Energie zurückgewinnen.
- Bei einer neu erstellten Zelle wird ein anfänglicher Energiewert von ihrem übergeordneten Element kopiert (und ein maximaler Wert, der durch die Spezifikation der Art vorgegeben wird).
- Säure : Wenn eine Zelle explodieren möchte, wird der Säuregrad der Zelle zur Berechnung des Schadens benachbarter Zellen herangezogen.
Aktionen
In jeder Runde kann jede Zelle eine Aktion ausführen:
Bewegen: Die Zelle bewegt sich um ein Feld in eine beliebige Richtung (N / S / E / W / NE / NW / SE / SW) zu einem Preis von 1 Energie.
- Eine Zelle kann sich nicht auf ein Feld bewegen, auf dem sich eine andere lebende Zelle befindet.
- Eine Zelle kann das Gitter nicht verlassen.
- Das Betreten einer Leiche zerstört die Leiche.
Angriff: Eine Zelle greift eine benachbarte Zelle an und verursacht 1 bis 3 Schadenspunkte, indem sie 1 bis 3 Energiepunkte verbraucht.
- Eine Zelle kann in jede Richtung angreifen (N / S / E / W / NE / NW / SE / SW).
- Es ist legal, freundliche Zellen anzugreifen.
Teilen: Die Zelle teilt sich und erzeugt eine neue Zelle auf einem angrenzenden Feld. Die Kosten betragen 5 Energiepunkte.
- Eine Zelle kann sich in jede Richtung teilen (N / S / E / W / NE / NW / SE / SW).
- Die neue Zelle hat volle HP gemäß Ihrer ursprünglichen Zellenspezifikation.
- Die neue Zelle hat nach Abzug der Teilungskosten so viel Energie wie ihre Mutterzelle. (Zum Beispiel wird eine Elternzelle mit anfänglichen 8 Energiepunkten auf 3 Energiepunkte reduziert und eine Kinderzelle mit 3 Energiepunkten erzeugt).
- Eine neue Zelle kann erst in deiner nächsten Runde aktiv werden.
- Eine Zelle kann sich nicht in einen Raum teilen, der von einer lebenden Zelle besetzt ist, sondern in einen Raum, der von einer Leiche mit toten Zellen besetzt ist (dies zerstört die Leiche).
Essen: Eine Zelle isst eine benachbarte Leiche und gewinnt 4 Energie.
- Eine Zelle kann in jede Richtung essen (N / S / E / W / NE / NW / SE / SW).
Pause: Eine Zelle tut für eine Runde nichts und gewinnt 2 Energie zurück.
Explodieren: Wenn eine Zelle 3 oder weniger HP und mehr Energie als HP hat, kann sie explodieren und allen acht benachbarten Zellen Schaden zufügen.
- Schaden an jeder benachbarten Zelle ist
(exploding cell HP) + (explodng cell acidity)
- Eine explodierte Zelle stirbt und hinterlässt eine Leiche, ebenso wie alle Zellen, die bei der Explosion getötet wurden.
- Schaden an jeder benachbarten Zelle ist
Protokoll
Installieren
Ihr Programm wird mit der BEGIN
in stdin angegebenen Zeichenfolge ausgeführt . Ihr Programm muss so schreiben, dass eine durch Leerzeichen getrennte Liste mit 3 nicht negativen ganzen Zahlen erstellt wird, die HP, Energie und Säure für Ihre Zellspezies darstellen: z 5 6 1
. Die Zahlen müssen sich zu 12 summieren. Die Säure kann sein 0
, wenn Sie es wünschen. (Andere Attribute können auch Null sein, aber wenn Sie dies tun, verfällt das Spiel!)
Sie beginnen mit einer Zelle in der nordwestlichen oder südöstlichen Ecke, ein Feld von jeder Kante entfernt. Die Anfangszelle hat volle HP und Energie.
Jede Zelle handelt
In jeder Runde wird Ihr Programm einmal für jede Zelle Ihres Teams aufgerufen (mit Ausnahme der Zellen, die gerade in dieser Runde erstellt wurden), damit die Zelle aktiv werden kann. Ihr Programm enthält Daten zu stdin, die den Petrischalenstatus und Informationen zu dieser bestimmten Zelle enthalten:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
Die ersten beiden Zahlen geben die Breite und Höhe der Arena an: Hier gibt es eine 10-mal-4-Arena.
- Die
o
Zellen gehören dir. Diex
Zellen sind deine Feinde. (Dies ist immer wahr; jeder Spieler sieht immer seine eigenen Zellen also
.) - Die
.
Räume sind leer. - Die
c
Räume stellen essbare Zellkörper dar.
Die Zahlen nach der leeren Zeile stellen Informationen zu dieser Zelle dar:
- Die ersten beiden Zahlen sind
x,y
Koordinaten, die von0,0
oben links indiziert werden (6 3
bezieht sich hier also auf die südlichsteo
Zelle). - Die dritte Zahl ist die HP der Zelle; Die vierte Zahl ist die Energie der Zelle.
Ihr Programm sollte eine Aktion ausgeben (um sie auszugeben). In den folgenden Beispielen wird N
als Beispiel eine Richtung verwendet, die jedoch für diese Aktion in jeder Richtung zulässig sein kann ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ SW
). Bei allen Programmausgaben wird die Groß- / Kleinschreibung nicht berücksichtigt, in den Beispielen wird jedoch Großbuchstabe verwendet. Jede ungültige Ausgabeaktion (entweder weil sie eine ungültige Syntax hat oder eine unzulässige Aktion versucht) wird ignoriert und führt dazu, dass die Zelle REST
aktiviert wird (und somit 2 Energie gewonnen wird).
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- die Zahl gibt die Stärke des Angriffs an (1 - 3)REST
EXPLODE
Ihr Team ist an der Reihe, alle Ihre Zellen erhalten die Möglichkeit, nacheinander zu handeln. Alle Ihre Zellen handeln, bevor die Zellen des Gegners handeln. Sobald alle deine Zellen aktiv sind, endet dein Zug und der Zug deines Gegners beginnt. Sobald alle Zellen deines Gegners aktiv sind, beginnt dein Zug erneut. In deinem Zug erhält jede Zelle die Priorität, basierend auf ihrem Alter zu handeln: Die ältesten Zellen in deinem Team handeln zuerst, bevor jüngere Zellen.
Beispiel
So könnte sich ein Programm verhalten. Die Eingabe von stdin wird hier mit führenden >
Pfeilen gekennzeichnet (von der tatsächlichen Eingabe durch ein klares Leerzeichen getrennt) und die Ausgabe von stdout hat <
Pfeile.
> BEGIN
< 5 6 1
Dann wird das Programm erneut aufgerufen:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
Nach dem Zug deines Gegners (der sich für DIVIDE W
die einzelne Startzelle entschieden hat) wird dein Programm zweimal aufgerufen, einmal für jede Zelle:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
Für den zweiten Aufruf in deinem Zug:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
Beachten Sie, dass in dieser zweiten Zelle der aktualisierte Board-Status basierend auf der Bewegung der anderen Zelle zu Beginn Ihres Zuges angezeigt wird. Beachten Sie auch, dass diese Zelle mit 1 Energie erzeugt wurde, da die übergeordnete Zelle bei der letzten Teilung 6 Energie hatte (die ursprüngliche 6, abzüglich der 5-Energie-Teilungskosten, erzeugte eine untergeordnete Zelle mit 1 Energie).
Jetzt ist dein Zug vorbei und der Zug deines Gegners beginnt. Die beiden gegenüberliegenden Zellen erhalten eine Chance zu handeln, und dann beginnt Ihr nächster Zug.
Sieg
Sie können gewinnen, indem Sie entweder:
- Zerstöre alle gegnerischen Zellen, oder
- Nachdem jeder Spieler 150 Runden absolviert hat, hat er mehr Zellen als dein Gegner
Die Wertung basiert auf der Anzahl der Siege in 100 Spielen gegen die jeweils andere Einsendung. In der Hälfte der Simulationen darf Ihr Programm zuerst gestartet werden.
Gleichstandspiele (dh genau die gleiche Anzahl von Zellen nach 150 Runden oder die einzigen verbleibenden Zellen, die bei einer Explosion zusammen getötet werden) werden nicht in den Gewinnsummen der beiden Spieler gezählt.
Andere Informationen
- Ihr Programm sollte nicht versuchen, den Zustand beizubehalten (über die Verwendung des Zustands der Petrischale hinaus): einzellige Organismen haben kein sehr gutes Gedächtnis und reagieren von Moment zu Moment auf die Welt. Insbesondere das Schreiben in eine Datei (oder einen anderen Datenspeicher), die Kommunikation mit einem Remoteserver oder das Festlegen von Umgebungsvariablen sind ausdrücklich nicht zulässig.
- Einsendungen werden unter Ubuntu 12.04.4 ausgeführt / kompiliert.
- Die Einzelheiten der 100 Punktespiele sind noch nicht bestätigt, aber sie werden wahrscheinlich mehrere Arenagrößen umfassen (z. B. 50 Läufe auf einer kleinen Arena und 50 Läufe auf einer größeren Arena). Für eine größere Arena kann ich die maximale Anzahl an Runden erhöhen, um sicherzustellen, dass ein ordnungsgemäßer Kampf stattfinden kann.
Ressourcen
Hier ist der Treibercode , mit dem die für Node.js geschriebene Simulation ausgeführt wird, die von aufgerufen wird node petri.js 'first program' 'second program'
. Beispielsweise könnte es so aussehen, wenn eine mit Python geschriebene Zelle mit einer mit Java geschriebenen Zelle verglichen wird node petri.js 'python some_cell.py' 'java SomeCellClass'
.
Außerdem ist mir klar, dass das Lesen und Parsen mehrerer Zeilen auf stdin ein großer Aufwand sein kann. Daher habe ich einige vollständige Beispielzellen in verschiedenen Sprachen entworfen, auf denen Sie aufbauen, vollständig überarbeiten oder vollständig ignorieren können.
- Java-Zelle
- Python-Zelle
- JavaScript-Zelle (zur Verwendung mit Node.js)
Natürlich steht es Ihnen frei, eine Zelle in einer anderen Sprache zu schreiben. Das sind einfach drei Sprachen, für die ich mich entschlossen habe, als zeitsparende Hilfe einen Code für das Boilerplate zu schreiben.
Wenn Sie Probleme beim Ausführen des Treibers haben, können Sie mich gerne in dem Chatroom anpingen, den ich für diese Herausforderung erstellt habe . Wenn Sie keinen ausreichenden Ruf für den Chat haben, hinterlassen Sie einfach einen Kommentar.
quelle
'node c:/cell/cell_template.js'
für jedes Argument einen vollständig ausführbaren Befehl wie'java CellTemplate'
für den Java-Code angeben . Das werde ich im Aufforderungstext verdeutlichen. Wenn Sie immer noch Probleme haben, können wir (und alle anderen mit technischen Problemen) diese Diskussion in einem Chatroom fortsetzen, den ich gerade erstellt habe .Antworten:
Hier ist mein relativ einfacher Bot, den ich in Ruby programmiert habe. Grundsätzlich wird zuerst die Teilung priorisiert und versucht, sich gegenüber Feinden zu teilen, um die Kontrolle über das Feld zu erlangen. Die zweite Priorität ist das Essen und die dritte ist das Angreifen. Die Sample-Python-Zelle ist leicht zu übertreffen.
quelle
$
.$
wird verwendet, um eine globale Variable anzugeben. Ja, sie sind böse, aber in diesem kleinen Programm spielt es keine große Rolle.Amöbe
Teilt sich zuerst in vier und versucht dann, in die Mitte zu gelangen, um den Replikationsraum des Gegners zu begrenzen. Dann beginnt die Replikation. Findet beim Bewegen oder Replizieren den optimalen Weg zum nächsten Feind und bewegt sich oder teilt sich darauf zu, um zu versuchen, den verfügbaren Raum des Feindes abzuschneiden.
Wenn sich ein Feind in der Nähe oder in einem Abstand von einem Feld befindet, greift er immer an oder bewegt sich auf ihn zu, sodass die dahinter stehende Reihe keine leeren Felder ausfüllt.
Ich habe dies noch nicht mit anderen Einsendungen getestet, habe also keine Ahnung, wie gut es funktionieren wird.
quelle
Einfache Zelle fertig in
node.js
. Getestet wurde es gegen Beispielknotenzellen und gegen Kostronor schlägt es sie.Aktualisieren
Versuchen Sie, sich dem Feind zu nähern oder sich zu teilen.
quelle
Evolution
Diese Vorlage hat sich weiterentwickelt und ist kein einfacher einzelliger Organismus mehr! Es versucht wann immer möglich anzugreifen / zu explodieren, sonst teilt es sich oder bewegt sich auf den Feind zu. Das Bewegen sollte das Problem einer Zelle lösen, die von freundlichen Zellen mit maximaler Energie umgeben ist und nichts Nützliches tun kann.
Nach dem Bewegen bleiben immer 3 Energie übrig, um den Feind so hart wie möglich zu treffen.
quelle
Berserker
Da ich Clojure verwendet habe, das einige Einschränkungen hat, hauptsächlich die enorme Startzeit, habe ich mir ein wenig Zeit gelassen. Wenn das Programm ausgegeben wird, zeigt
BEGIN
es an4 6 2 LOOP
, dass es nicht anhält. Dann nimmt es die Eingaben als kontinuierlichen Strom und endet mitEND
. Es speichert keinen Zustand, was dadurch verdeutlicht wird, dass keine globalen Variablen verwendet oder Rückgabewerte wiederverwendet werden. Da die Implementierung für diese Loop-Aktion noch nicht abgeschlossen ist, konnte ich den Code nicht vollständig testen (ich hoffe, der Code ist klar genug).Die Zelle erhielt ihren Namen, weil sie wann immer möglich explodiert (und somit sauer ist) und Angriffe unmittelbar nach der Teilung priorisiert.
Ich habe die generierte JAR-Datei in meine Dropbox hochgeladen . Laufen Sie mit
java -jar petridish-clojure.jar
Nur um klarzustellen:
Protokoll aktualisieren
quelle
Hungriger, hungriger Bot
Hier ist ein Eintrag in R. Ich hoffe, ich habe die technischen Spezifikationen für die Kommunikation mit Ihrem Programm richtig verstanden. Sollte mit ausgelöst werden
Rscript Hungryhungrybot.R
.Wenn es mindestens 6 Energiepunkte hat, teilt es sich vorzugsweise in Richtung des Feindes. Ansonsten frisst es, was daneben ist oder was erreichbar ist. Wenn keine Nahrung verfügbar ist, explodiert sie entweder, wenn mehr Feinde als Schwesterzellen in der Nähe sind, oder sie kämpft mit Gegnern in der Nähe. Ruht nur, wenn die Energie 0 ist und nichts zu essen verfügbar ist.
quelle
Error: unexpected 'else' in "else"
in Ihren Code. Ich fürchte, ich kenne R überhaupt nicht, also kann ich diesen Fehler nicht lösen. Als Referenz wird diese Fehlermeldung sowohl beim Ausführen im Treiber als auch beim einfachen Ausführen des Programms und beim manuellen Eingeben angezeigtBEGIN
.Error in if (dir[1] < 0) where <- paste(where, "N", sep = "") : missing value where TRUE/FALSE needed
Error: object 'food' not found
Koordinierte Bakterien
Ich hoffe ich bin nicht zu spät
Gewinne in meinen Tests gegen andere Gegner (und töte sie immer alle), und der Kampf wird niemals enden, wenn er sich selbst stellt - ein Beweis dafür, dass die Strategie stark ist.
Wenn Sie einzellig sind, können Sie sich den vorherigen Status merken, aber Sie können Ihre eigene Position ausnutzen, um sich anders zu verhalten! =)
Dies teilt die Bakterien in Teiler und Beweger auf und hält dabei mehr Bakterien nützlich als nur die Frontlinie, während die Verteidigungslinie in Ordnung bleibt.
Es koordiniert auch seine Angriffe, um sich auf bestimmte Feinde zu konzentrieren, so dass Feinde schneller getötet werden (dies ist, um sich meiner anderen Einzelzelle zu stellen, die sich auf HP konzentriert).
In der Spielmitte, die durch die Anzahl der Zellen auf dem Spielfeld erkannt wird, versuchen sie, das feindliche Territorium zu erobern, indem sie sie überflanken. Dies ist die wichtigste Gewinnstrategie.
Dies hat die höchste Wachstumsrate im Vergleich zu allen anderen Gegnern derzeit, aber es hat einen langsamen Start, so dass dies auf großen Arenen besser funktioniert.
Führen Sie es mit
java CoordinatedBacteria
quelle
Ich denke, ich werde meinen Beitrag veröffentlichen, da Sie so großzügig sind, die Boilerplate-Logik hinzuzufügen ...
Es gab ein Problem in Ihrer Logik, bei dem die Essaktion einen ANGRIFF anstelle eines EAT ausgab und die Leiche verschwendete.
Ich habe Ihren Kern genauso modifiziert, um eine funktionierende Lösung zu haben, die relativ gut funktionieren sollte. Es beginnt mit 4 PS und 8 Energie, so dass sich nach einer Trennung und einer Pause beide Zellen wieder trennen können. Es wird versuchen, sich zu vermehren, Feinde anzugreifen, Leichen zu essen und sich auszuruhen, in dieser Reihenfolge. Innere Zellen speichern also ihre 8 Energiepunkte, um getötete äußere Zellen schnell zu ersetzen, und lassen 3 Energiepunkte übrig, um einen 3-Punkte-Angriff auszuführen oder sich nach einer Spielzugpause zu vervielfachen. Die 4 PS sollen mindestens einen Vollkraftangriff überstehen.
Säure scheint eine Verschwendung von Punkten für mich zu sein, also habe ich es rausgehalten ...
Ich habe die Einsendung nicht getestet, da es eine 2-Minuten-Sache war;)
Hier ist mein Code:
quelle
Dünn ausgebreiteter Bomber
Da Sie uns freundlicherweise den Code für das Boilerplate zur Verfügung gestellt haben, habe ich beschlossen, meine eigene einfache Zelle zu erstellen. Diese Zelle hat 4 Säure, nur 1 PS und 7 Energie. Es versucht, aus der Reichweite von Freundschaftsspielen herauszukommen und wartet dort (oder isst, wenn möglich), bis es die Chance bekommt, in die Luft zu jagen oder sich zu replizieren. Angriffe nur, wenn dies die einzige Option ist.
Es ist eine ziemlich knallharte Strategie und wird wahrscheinlich schlecht abschneiden, aber ich bin gespannt, wie sie funktioniert. Ich werde es vielleicht später testen und verbessern.
quelle
node c:/cells/petri.js 'node c:/cells/bomber.js' 'node c:/cells/sample.js
. Wenn ich dies in die Knotenanwendungskonsole eingebe, erhalte ich nur drei Punkte. Wenn ich versuche, es in Windows Cmd auszuführen, erhalte ich: 'Knoten' wird nicht als interner oder externer Befehl, ausführbares Programm oder Batch-Datei erkannt. Ich habe alle Dateien als .js-Dateien im richtigen Ordner gespeichert. Jegliche Hilfe für einen Noob? Ich würde zum Chat gehen oder woanders kommentieren, aber meine Wiederholung ist zu niedrig.if((nearbyEnemies.length - nearbyFriendlies.length > 1 ¦¦
- diese¦¦
scheinen kein gültiger Operator zu sein und Sie haben nicht übereinstimmende Klammern. Ich denke, vielleicht ist die Code-Formatierung durcheinander geraten, als Sie sie gepostet haben?=
), wenn Sie einen Gleichstellungsvergleich (==
) wünschen .