W tym wyzwaniu napiszesz bota, który gra dylemat więźnia. Oto haczyk: nie będziesz mieć dostępu do historii poprzednich gier. Zamiast tego będziesz miał dostęp do samego przeciwnika. W tej wersji obaj gracze otrzymują +2 punkty, jeśli obaj ze sobą współpracują, +1 punkty, jeśli obaj wadą, a jeśli jeden współpracuje z jedną wadą, dezerter otrzymuje +3, a drugi nie otrzymuje punktów. Każde zgłoszenie będzie odtwarzane 10 razy względem każdego innego zgłoszenia, w tym samego siebie. Zwycięzcą jest zgłoszenie z największą liczbą punktów.
Kontroler : Powinieneś napisać funkcję javascript w formie
function submissionName(them) {
/* Your code here */
}
Kontroler używa właściwości funkcji name
do wyświetlania wyników, więc jeśli nie jest ona w tym formacie (a zamiast niej f = x => ...
lub f = function() { ... }
), trudno będzie zobaczyć wynik i nie będzie można uzyskać dostępu do własnej funkcji.
Funkcja zaakceptuje jeden parametr: them
funkcję przeciwnika. Może wtedy wywołać tę funkcję, aby zobaczyć, jaka reakcja przeciwnika otrzyma określone funkcje jako dane wejściowe. Na podstawie tych danych musisz zwrócić „C” lub „D” odpowiednio dla współpracy lub usterki.
Przykłady (będą konkurować):
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'));
}
Kontroler jest dostępny tutaj
Zasady :
- Nie będziesz w stanie zobaczyć samego kodu przeciwnika. Wszystkie funkcje są opakowane, aby wyglądały tak samo, gdy
toString()
są wywoływane. Jedynym sposobem na zbadanie przeciwnika (który może być sobą) jest przetestowanie go. - Twoja funkcja nie musi być deterministyczna. Możesz zapisać stan tylko poprzez ustawienie właściwości dla własnej funkcji, takiej jak
submissionName.state = {};
. Jednak między meczami (nawet między meczami tych samych graczy) stan jest kasowany przez wywołanietoString()
ieval
. Dlatego nie ma pamięci o poprzednich meczach. - Kolejność wywoływania funkcji w pierwszym dopasowaniu jest losowa.
- Jeśli Twój kod zgłasza błąd, będzie traktowany tak, jakbyś współpracował, podczas gdy twój przeciwnik jest wadliwy. Jeśli pierwszy biegniesz, kod przeciwnika nawet nie zostanie wywołany. Dzieje się tak nawet wtedy, gdy błąd pojawia się w kodzie przeciwnika podczas twojego sprawdzania
them
. Uważaj na błędy przepełnienia stosu, szczególnie w przypadku wywołań koduthem(wrap(submissionName))
, ponieważ mogą one zrobić to samo. - Nie możesz uzyskać dostępu do zmiennej
self
ani żadnej innej zmiennej, która jest objęta zakresem, gdyeval
jest nazywana Z WYJĄTKIEM funkcjiwrap
. Ta funkcja pozwala na wołanie przeciwnika w sposób nie do odróżnienia od sposobu, w jaki kontroler wywołuje funkcję. Nie możesz pisaćMath
,window
itd (można użyć funkcji, takich jakMath.random()
, jednak). - Nie można uzyskać dostępu do śledzenia stosu, tworząc metodę
Error
lub inną metodą.
Uwaga dotycząca zbyt długiego czasu: unikaj utknięcia w while
pętla na zawsze. Łączny czas obu zawodników nie powinien przekraczać 1 sekundy w danej rundzie. Aby to wymusić, wybierany jest losowy limit czasu między 1000 ms a 2000 ms (ma to na celu uniknięcie gry przez celowe oczekiwanie znanej ilości czasu), a jeśli proces roboczy trwa dłużej, zostanie zgłoszony błąd. Jeśli tak się stanie, przyczyna błędu zostanie określona w następujący sposób: wykonanie zostanie wstrzymane w losowym momencie po 1000 ms, a stos wywołań w tym momencie zostanie sprawdzony. Oskarżony zostanie ostatnio nazywany konkurent, który jest obecnie w pętli (lub rekurencji podobnej do pętli, w tym sensie, że jest to rekurencja skonfigurowana w celu uniknięcia błędu przepełnienia stosu). Jeśli winny jest ten sam zawodnik za kilkakrotne spowodowanie błędu „zbyt długiego”, zostanie on zdyskwalifikowany.
źródło
them
musi być deterministyczna / przestrzegać reguł? Na przykładfunction me(them){let log=0;them(x=>{++log;return 'C';})
; return log == 0? 'D': 'C';}StackOverflow
błędem, a nie nieskończoną pętlą, która nigdy się nie kończy. Jeśli może to spowodowaćStackOverflow
, upewnij się, że dodałeś instrukcję try-catch. Na przykład rekurencji, która nie osiągnie błęduthem(() => 'C')
nie spowodowałoby to błędu, ponieważ gdy przeciwnik dzwonithem
, wywołuje() => 'C'
funkcję. Jedyną rzeczą, którą należy zapakować,try-catch
byłoby wywołaniethem
z parametrem jakiejś funkcji, która wywołuje sięthem
z parametrem funkcji wywołującejthem
itp. (Nieskończenie). Na przykład,them(t => t(() => 'C'))
zagrałby wszystko , co grałby przeciwnik, gdyby przeciwnik myślał, że granice
. Nie ma możliwościstackoverflow
błędu.Odpowiedzi:
BoomBot
Jeśli przeciwnik zostanie uruchomiony jako pierwszy i sprawdzi to bez
try..catch
tego, bot automatycznie zdobędzie 3 punkty. Zero punktów w każdym innym przypadku.źródło
Archeopteryx
cooperate
, naśladuj ruch przeciwnikadefect
.defect
lub znice
, to wada.Co sprawia, że jest to dobra strategia? Nie mam pojęcia. Wygenerowałem go przy użyciu algorytmu ewolucyjnego, częściowo przeszkolonego w zakresie bieżących zgłoszeń.
Tiktaalik
cooperate
, odwróć jego ruch przeciwdefect
.defect
, to wada.notNice
.Kolejna strategia generowana ewolucyjnie.
źródło
WhatWouldBotDoBot
WhatWouldBotDoBot jest dość prosty; po prostu testuje przeciwnika pod kątem tego, co zrobiłby z programem w stanie ustalonym. Jeśli bot woli współpracować, jeśli to możliwe, WWBDB również preferuje współpracę (więc będzie współpracować z ładnym botem). WWBDB nie woli współpracy.
źródło
Sprawdź stan
Jeśli mnie wzywają, to prawdopodobnie są nimi naprawdę. Działamy jako uciekinier. Jeśli mnie nie wzywają, to prawdopodobnie są opakowanym testerem. Zachowalibyśmy się ładniej.
Powyżej jest oryginalna odpowiedź. A może powinienem podjąć współpracę, aby zdobyć więcej punktów.
Sprawdź stan za pomocą self-coop
źródło
RandomBot
Bo czemu nie.
źródło
Złożoność
Testy złożoności sprawdzają, czy bot to Cooperate czy Defect. Jeśli tak, to współpracuje, ale jeśli nie, to ma wady. Wszystkie obecne boty, które testują swoich przeciwników, używają prostych funkcji do testowania odpowiedzi, więc w takich przypadkach Złożoność udaje Współpracę.
źródło
Chcę, aby to działało, aby zawsze mieć wadę, z wyjątkiem gry przeciwko sobie. Próbuje to zrobić, przekazując funkcję „tester”, która nie jest do nich opakowana, i próbuje wykryć, czy „one” są nazwane tester. Jeśli nazywa się tester, zmienia zmienną statyczną aktywowaną na true, a następnie zwraca kooperację. Ale to nie działa. Nie znam się zbyt dobrze na javascript i prawdopodobnie wprowadzę jeszcze kilka zmian.
źródło
tester
funkcję: DNiemiły
Naśladuje reakcję przeciwnika na ugięcie
źródło
Uwaga 2
Odporna na boom wersja NotNice od FatalError .
źródło
Zdrowy rozsądek
Uwaga: Nie znam javascript.
Jeśli możesz zarobić na miłej osobie, zrób to. W przeciwnym razie zwróć to, co zwrócą, jeśli staną w obliczu współpracy (przynajmniej tak mi się wydaje ).
źródło
A ty gdzie chcesz? (zainspirowany zmiennościami w księdze dżungli)
źródło
this
to to samo co self. Myślę, że chciałeś powiedziećreturn them(yourself)
.this
nie jest zmienną, jest słowem kluczowym w kontekście funkcjithis!=self
.self
oznaczałoby obiekt okna ithis
samą funkcję (zawsze odnosi się do kontekstu, w którym się znajduje, dlatego nie jest uważany za zmienną). Dlatego posiadanievar self = this;
na początku wielu przykładów kodu można uznać za wprowadzające w błąd. Dodano wersję bez „tego”this
Nie odnosi się do funkcji.yourself
iyourself_no_this
działają inaczej.this
zasadniczo nigdy nie odnosi się do funkcji w javascript. Zobacz: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Karać inspektorów
Daj botowi trochę kodu i sprawdź, czy go uruchamia. Jeśli uruchomiono go więcej niż raz, bot jest złym inspektorem i musimy się wycofać! Jeśli uruchomiono go dokładnie raz, zagraj jako niezły bot. Jeśli nigdy nie był uruchamiany, współpracuj.
Historia
Co zrobiłby ostatni bot, który widziałem przeciwko temu przeciwnikowi?
Wyniki dla turnieju rundy 10000:
źródło
Mal próbuje ustalić, czy jest w symulacji, czy nie. Jeśli tak, zakłada, że ostatecznie otrzyma prawdziwy kod
them
, i próbuje różnych strategii, aby przekonać ich do współpracy.Jeśli nie ma pewności, sprawdza, czy może za darmo wykonać defekt, a jeśli nie, próbuje skopiować to
them
, co zrobiłby, gdy otrzyma współpracownika.źródło
TrickyBot
Staraj się być nieprzewidywalny
źródło
selfapply
Nie jestem pewien, czy to ma sens, ale wydaje się interesujące! Rób tak, jak robisz sobie, powtarzaj, aby złapać przypadkowość. Jeśli to nie zadziała, bądź miły.
Nie przetestowany i mój pierwszy kod javascript, i bardziej złożony niż się spodziewałem.
źródło
selfapply(selfapply)
połączeniaselfapply(selfapply)
!RandomAlternate
Nauczyłem się więc, jak używać właściwości dla stanu ...
źródło
Murder Bot # 1
Powoduje nieskończoną pętlę, za którą bardziej prawdopodobne jest obwinienie przeciwnika.
źródło
Bot Platinum Rule
Zasada Platinum mówi: „Traktuj innych tak, jak chcą być traktowani”. Mój bot to akceptuje. Cokolwiek zrobiliby sobie, zakładamy, że chcieliby być traktowani, my im to robimy. Jeśli zgłoszą błąd, zakładamy, że chcą współpracować.
źródło
TheGolfedOne (nazwa func:
a
, 63 bajtyKod w golfa jest trudny do odczytania. Z tego powodu
them
pęknie.Nie w pełni zrozumiałem mechanikę tego KotH, ale przypuszczam, że jeśli przeciwnik jest bezpaństwowcem, muszę go po prostu złamać, kiedy będę się bronił.
Wynik jego pierwszego turnieju (przepraszam, nie zawracałem sobie głowy używaniem wszystkich botów)
Nie idzie mu tak źle, jak myślałem, 3. miejsce (wśród nich) pierwsza próba.
Druga próba,
a
znów 260, znów 3 miejsce, z tyłuonlyTrustYourself
idefect
znowu. W końcu może być spójne :)PS: Nie jestem zbyt dobry w golfa, więc żart jest większy niż cokolwiek innego. Tutaj skróciłem tylko nazwy zmiennych, nazwy func i usunąłem jak najwięcej białych znaków.
źródło
Karma
Jeśli przeciwnik będzie z nami współpracował, będziemy współpracować. Jeśli będą próbować się zepsuć, gdy będziemy współpracować, my również to zrobimy.
źródło