In dieser Herausforderung schreiben Sie einen Bot, der das Dilemma des Gefangenen darstellt. Hier ist der Haken: Sie haben keinen Zugriff auf die Geschichte der vorherigen Spiele. Stattdessen haben Sie Zugriff auf den Gegner selbst. In dieser Version erhalten beide Spieler +2 Punkte, wenn beide kooperieren, +1 Punkte, wenn beide defekt sind, und wenn einer kooperiert, aber einer defekt ist, erhält der Defektor +3, während der andere keine Punkte erhält. Jede Einreichung wird zehnmal gegen jede andere Einreichung, einschließlich sich selbst, gespielt. Gewinner ist die Einsendung mit den meisten Gesamtpunkten.
Controller : Sie sollten eine Javascript-Funktion in das Formular schreiben
function submissionName(them) {
/* Your code here */
}
Der Controller verwendet die name
Eigenschaft der Funktion , um die Ergebnisse anzuzeigen. Wenn diese also nicht in diesem Format vorliegen (und stattdessen f = x => ...
oder vorliegen f = function() { ... }
), ist es schwierig, Ihre Punktzahl anzuzeigen, und Sie können nicht auf Ihre eigene Funktion zugreifen.
Die Funktion akzeptiert einen Parameter: them
Dies ist die Funktion des Gegners. Es kann dann diese Funktion aufrufen, um zu sehen, wie die Reaktion des Gegners bestimmte Funktionen als Eingaben erhalten würde. Basierend auf diesen Daten müssen Sie "C" oder "D" für die Zusammenarbeit bzw. den Defekt zurückgeben.
Beispiele (werden konkurrieren):
function cooperate(them) {
return 'C';
}
function defect(them) {
return 'D';
}
function nice(them) {
// Do whatever they would do when faced with a cooperator
return them(wrap(_ => 'C'));
}
Der Controller ist hier verfügbar
Regeln :
- Sie können den Code des Gegners selbst nicht sehen. Alle Funktionen werden so umbrochen, dass sie beim
toString()
Aufruf gleich aussehen . Die einzige Möglichkeit, einen Gegner (der Sie selbst sein könnte) zu untersuchen, besteht darin, ihn zu testen. - Ihre Funktion muss nicht deterministisch sein. Sie können den Status nur speichern, indem Sie Eigenschaften für Ihre eigene Funktion festlegen, z
submissionName.state = {};
. Zwischen Spielen (auch zwischen Spielen der gleichen Spieler) wird der Status durch Aufrufen vontoString()
und gelöschteval
. Daher gibt es keine Erinnerung an vorherige Übereinstimmungen. - Die Reihenfolge, in der die Funktion in jeder Übereinstimmung zuerst aufgerufen wird, ist zufällig.
- Wenn Ihr Code einen Fehler auslöst, wird er so behandelt, als hätten Sie zusammengearbeitet, während Ihr Gegner defekt war. Wenn Sie der Erste sind, der rennt, wird der Code des Gegners nicht einmal aufgerufen. Dies geschieht auch dann, wenn der Fehler im Code Ihres Gegners auftritt, während Sie anrufen
them
. Seien Sie vorsichtig bei Stapelüberlauffehlern, insbesondere wenn Ihr Code aufruftthem(wrap(submissionName))
, da diese möglicherweise dasselbe tun. - Sie dürfen nicht auf die Variable
self
oder eine andere Variable zugreifen, die sich zufällig im Gültigkeitsbereich befindet, wenneval
AUSSER der Funktion aufgerufen wirdwrap
. Mit dieser Funktion können Sie den Gegner auf eine Weise anrufen, die nicht davon zu unterscheiden ist, wie der Controller eine Funktion aufruft. Sie können nicht schreibenMath
,window
etc. (Sie Funktionen verwenden können, wie zum BeispielMath.random()
, jedoch). - Sie können möglicherweise nicht auf den Stack-Trace zugreifen, indem Sie eine
Error
oder eine andere Methode erstellen .
Ein Hinweis, der zu lange dauert: Vermeiden Sie es, in a stecken zu bleiben while
Schleife für immer. Die kombinierte Zeit beider Wettkämpfer sollte in einer Runde 1 Sekunde nicht überschreiten. Um dies zu erzwingen, wird eine zufällige Zeitüberschreitung zwischen 1000 ms und 2000 ms gewählt (dies dient dazu, das Spielen zu vermeiden, indem absichtlich eine bekannte Zeitspanne abgewartet wird). Wenn der Worker länger für die Ausführung benötigt, wird ein Fehler ausgegeben. In diesem Fall wird die Fehlerursache wie folgt ermittelt: Die Ausführung wird zu einem beliebigen Zeitpunkt nach 1000 ms unterbrochen, und der Aufrufstapel wird zu diesem Zeitpunkt überprüft. Der zuletzt aufgerufene Konkurrent, der sich derzeit in einer Schleife befindet (oder eine schleifenartige Rekursion in dem Sinne, dass es sich um eine Rekursion handelt, die eingerichtet wurde, um einen Stapelüberlauffehler zu vermeiden), wird dafür verantwortlich gemacht. Wenn derselbe Teilnehmer dafür verantwortlich gemacht wird, dass er mehrmals einen "zu langen" Fehler verursacht hat, wird dieser Teilnehmer disqualifiziert.
quelle
them
deterministisch sein / den Regeln folgen? Zum Beispielfunction me(them){let log=0;them(x=>{++log;return 'C';})
: return log == 0? 'D': 'C';}StackOverflow
Fehler und nicht zu einer Endlosschleife führen muss, die niemals beendet wird. Wenn dies zu einem führen könnteStackOverflow
, stellen Sie sicher, dass Sie eine Try-Catch-Anweisung hinzufügen. Für ein Beispiel für eine Rekursion, bei der innerhalb von 1 Sekunde kein Stackoverflow-Fehler auftritt, benötigen Sie weitere undurchsichtige Beispiele wie stackoverflow.com/q/12438786/3371119them(() => 'C')
würde in einem Fehler nicht zur Folge hat, weil , wenn der Gegner nenntthem
, ist es die Anruf() => 'C'
Funktion. Das Einzige, was eingeschlossen werden muss,try-catch
wäre, wenn Siethem
mit einem Parameter einer Funktion aufrufen , diethem
mit einem Parameter einer Funktion aufruft, diethem
usw. aufruft (unendlich). Zum Beispielthem(t => t(() => 'C'))
würde spielen, was auch immer der Gegner spielen würde, wenn der Gegner dachte, dass er spieltnice
. Es besteht keine Möglichkeit einesstackoverflow
Fehlers.Antworten:
BoomBot
Wenn der Gegner zuerst läuft und dies ohne
try..catch
callt, gewinnt dieser Bot automatisch 3 Punkte. Nullpunkte in jedem anderen Fall.quelle
Archaeopteryx
cooperate
, ahmen Sie den Zug des Gegners nachdefect
.defect
oder mit kooperiertnice
, dann defekt.Was macht dies zu einer guten Strategie? Ich habe keine Ahnung. Ich habe es mit einem evolutionären Algorithmus generiert, der teilweise auf aktuellen Einsendungen trainiert wurde.
Tiktaalik
cooperate
defekt ist, dann kehre den Zug des Gegners gegen umdefect
.defect
, dann einen Defekt.notNice
.Eine andere evolutionär generierte Strategie.
quelle
WhatWouldBotDoBot
WhatWouldBotDoBot ist ziemlich einfach; es testet seinen Gegner nur auf das, was er gegen ein stationäres Programm tun würde. Wenn ein Bot die Zusammenarbeit bevorzugt, wird WWBDB auch die Zusammenarbeit bevorzugen (so wird es mit einem netten Bot zusammenarbeiten). Die WWBDB selbst bevorzugt keine Kooperation.
quelle
Überprüfen Sie Stateful
Wenn sie mich anrufen, dann sind sie wahrscheinlich wirklich sie. Wir treten als Überläufer auf. Wenn sie mich nicht anrufen, dann sind sie wahrscheinlich ein umwickelter Tester. Wir würden uns als netter verhalten.
Oben ist die ursprüngliche Antwort. Und vielleicht sollte ich mich zusammenschließen, um mehr Punkte zu sammeln.
Prüfen Sie Stateful mit Self-Coop
quelle
RandomBot
Weil warum nicht.
quelle
Komplexität
Komplexitätstests, um festzustellen, ob es sich bei dem Bot um Cooperate oder Defect handelt. Wenn dies der Fall ist, kooperiert es, aber wenn dies nicht der Fall ist, weist es Mängel auf. Alle aktuellen Bots, die ihre Gegner testen, verwenden einfache Funktionen, um die Antworten zu testen. In diesen Fällen wird die Komplexität lediglich so tun, als ob sie kooperieren würden.
quelle
Wie ich das machen will ist immer defekt, außer wenn man gegen sich selbst spielt. Dies wird versucht, indem eine "Tester" -Funktion übergeben wird, die nicht in sie eingeschlossen ist, und es wird versucht zu erkennen, ob "sie" als Tester bezeichnet werden. Wenn es tester heißt, ändert es die aktivierte statische Variable in true und gibt cooperate zurück. Aber es geht nicht. Ich kenne mich mit Javascript nicht so gut aus und werde wahrscheinlich noch einige Änderungen vornehmen.
quelle
tester
Funktion macht : DNicht nett
Imitiert die Reaktion des Gegners auf Ablenkung
quelle
NotNice 2
Boomsichere Version von NotNice von FatalError .
quelle
Gesunder Menschenverstand
Haftungsausschluss: Ich kenne kein Javascript.
Wenn Sie von einer netten Person profitieren können, tun Sie es. Andernfalls geben Sie zurück, was sie zurückgeben würden, wenn sie sich einer Zusammenarbeit gegenübersehen würden (zumindest denke ich, dass dies der Fall ist).
quelle
Und wo willst du hin? (inspiriert von den Bänden im Buch des Dschungels)
quelle
this
ist dasselbe wie self. Ich denke, dass Sie sagen wolltenreturn them(yourself)
.this
ist keine Variable, sondern ein Schlüsselwort und steht im Kontext einer Funktionthis!=self
.self
würde das Fensterobjekt undthis
die Funktion selbst bedeuten (bezieht sich immer auf den Kontext, in dem es sich befindet, weshalb es nicht als Variable betrachtet wird). Aus diesem Grund kann esvar self = this;
als irreführend angesehen werden , am Anfang viele Codebeispiele zu haben. Version ohne "this" hinzugefügtthis
Bezieht sich nicht auf die Funktion.yourself
undyourself_no_this
laufen unterschiedlich.this
bezieht sich grundsätzlich nie auf die Funktion in Javascript. Siehe: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Prüfer bestrafen
Geben Sie dem Bot Code und prüfen Sie, ob er ausgeführt wird. Wenn es mehrmals ausgeführt wurde, ist der Bot ein böser Inspektor, und wir müssen defekt sein! Wenn es genau einmal ausgeführt wurde, spielen Sie als nicht schöner Bot. Wenn es nie gelaufen ist, kooperieren Sie.
Geschichte
Was würde der letzte Bot, den ich gesehen habe, gegen diesen Gegner tun?
Ergebnisse für ein 10000-Runden-Turnier:
quelle
Mal versucht festzustellen, ob es sich um eine Simulation handelt oder nicht. Wenn dies der Fall ist, wird davon ausgegangen, dass der eigentliche Code für ihn schließlich übergeben wird
them
, und es werden verschiedene Strategien versucht, um sie zur Zusammenarbeit zu überreden.Wenn es nicht sicher ist, prüft es, ob es kostenlos defekt sein kann, oder wenn nicht, versucht es zu kopieren, was
them
tun würde, wenn es einem Mitarbeiter gegeben wird.quelle
TrickyBot
Versuche unberechenbar zu sein
quelle
selbstbewusst
Ich bin mir nicht sicher, ob es Sinn macht, aber es scheint interessant zu sein! Tun Sie sich selbst gegenüber, wiederholen Sie dies, um den Zufall zu fangen. Wenn das nicht funktioniert, sei nett.
Ungetestet und mein erster Javascript-Code, und komplexer als ich erwartet hatte.
quelle
selfapply(selfapply)
Anrufen selbst disqualifizierenselfapply(selfapply)
!RandomAlternate
So lernte ich, wie man Eigenschaften für Zustand benutzt ...
quelle
Mordbot # 1
Verursacht eine Endlosschleife, für die der Gegner mit größerer Wahrscheinlichkeit verantwortlich gemacht wird.
quelle
Der Platinum Rule Bot
Die Platinregel besagt: "Behandle andere so, wie sie behandelt werden möchten." Mein Bot nimmt das auf. Was auch immer sie sich selbst antun würden, was wir annehmen, ist, wie sie behandelt werden möchten, das tun wir ihnen. Wenn sie einen Fehler auslösen, gehen wir davon aus, dass sie zusammenarbeiten möchten.
quelle
TheGolfedOne (Funkname:
a
, 63 BytesGolf-Code ist schwer zu lesen. Daran
them
wird brechen.Ich habe die Mechanik unter diesem KotH nicht vollständig verstanden, aber ich nehme an, dass ich sie nur brechen muss, während ich defekt bin, wenn der Gegner staatenlos ist.
Das Ergebnis seines ersten Turniers (ich habe nicht alle Bots benutzt, sorry)
Es geht ihm nicht so schlecht, wie ich dachte, der dritte Platz (unter denen) ist der erste Versuch.
Zweiter Versuch,
a
bekam 260 wieder, 3. Platz wieder, hinteronlyTrustYourself
unddefect
wieder. Es könnte am Ende konsistent sein :)PS: Ich bin nicht so gut im Golfen, also ist es mehr für den Witz als alles andere. Hier habe ich nur Variablennamen, Funknamen gekürzt und so viel Leerzeichen wie möglich entfernt.
quelle
Karma
Wenn der Gegner mit uns zusammenarbeiten würde, dann würden wir zusammenarbeiten. Wenn sie versuchen würden, bei der Zusammenarbeit Fehler zu machen, werden auch wir Fehler machen.
quelle