In questa sfida, scriverai un robot che recita il dilemma del prigioniero. Ecco il trucco: non avrai accesso alla cronologia dei giochi precedenti. Invece, avrai accesso all'avversario stesso. In questa versione, entrambi i giocatori ottengono +2 punti se cooperano entrambi, +1 punti se difettano entrambi, e se uno collabora ma uno difetta, il disertore ottiene +3 mentre l'altro non ottiene punti. Ogni invio verrà giocato contro ogni altro invio, incluso se stesso, 10 volte. Il vincitore è l'invio con il punteggio più totale.
Controller : dovresti scrivere una funzione javascript, nel modulo
function submissionName(them) {
/* Your code here */
}
Il controller utilizza la name
proprietà della funzione per visualizzare i risultati, quindi se non è in questo formato (ed è invece f = x => ...
o f = function() { ... }
) sarà difficile vedere il tuo punteggio e non sarai in grado di accedere alla tua funzione.
La funzione accetterà un parametro: them
che è la funzione dell'avversario. Può quindi chiamare quella funzione per vedere quale sarebbe la reazione dell'avversario a determinate funzioni come input. Sulla base di tali dati, è necessario restituire 'C' o 'D' per cooperare o per difetto rispettivamente.
Esempi (saranno in competizione):
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'));
}
Il controller è disponibile qui
Regole :
- Non sarai in grado di vedere il codice dell'avversario stesso. Tutte le funzioni sono racchiuse in modo che appaiano uguali quando
toString()
viene chiamato. L'unico modo per esaminare un avversario (che potrebbe essere te stesso) è metterli alla prova. - La tua funzione non deve essere deterministica. È possibile salvare lo stato solo impostando le proprietà sulla propria funzione, ad esempio
submissionName.state = {};
. Tuttavia, tra le partite (anche tra le partite degli stessi giocatori), lo stato viene cancellato chiamandotoString()
eeval
. Pertanto, non esiste memoria delle partite precedenti. - L'ordine di quale funzione viene chiamata per prima in ogni corrispondenza è randomizzato.
- Se il tuo codice genera un errore, verrà trattato come se avessi collaborato mentre il tuo avversario disertava. Se sei il primo a correre, il codice dell'avversario non verrà nemmeno chiamato. Ciò accade anche se l'errore si verifica nel codice del tuo avversario mentre stai chiamando
them
. Fai attenzione agli errori di overflow dello stack, soprattutto se il tuo codice chiamathem(wrap(submissionName))
, poiché potrebbero fare lo stesso. - Non è possibile accedere alla variabile
self
o a qualsiasi altra variabile che si trova nell'ambito nell'ambitoeval
della funzione EXCEPTwrap
. Questa funzione consente di chiamare l'avversario in modo indistinguibile da come il controller chiama una funzione. Non è possibile scrivere aMath
,window
ecc. (È possibile utilizzare funzioni come, ad esempioMath.random()
). - Non è possibile accedere alla traccia dello stack creando un
Error
o con un altro metodo.
Una nota sul prendere troppo tempo: si prega di evitare di rimanere bloccati in a while
loop per sempre. Il tempo combinato di entrambi i concorrenti non deve superare 1 secondo in un dato round. Per imporre questo, viene scelto un timeout casuale tra 1000 ms e 2000 ms (questo per evitare il gioco aspettando intenzionalmente un periodo di tempo noto) e se il lavoratore impiega più tempo di quello per eseguire, verrà generato un errore. In tal caso, la causa dell'errore verrà determinata come segue: l'esecuzione verrà messa in pausa in un momento casuale dopo 1000 ms e lo stack di chiamate in quel momento verrà ispezionato. Verrà incolpato il concorrente chiamato più recentemente che è attualmente in un ciclo (o ricorsione simile a un ciclo, nel senso che si tratta di una ricorsione impostata per evitare un errore di overflow dello stack). Se lo stesso concorrente viene incolpato per aver causato più volte un errore "che richiede troppo tempo", quel concorrente verrà squalificato.
them
essere deterministica / seguire le regole? Ad esempio function me(them){let log=0;them(x=>{++log;return 'C';})
; return log == 0? 'D': 'C';}
StackOverflow
errore e non un ciclo infinito che non si chiude mai. Se ciò può comportare un StackOverflow
, assicurati di aggiungere un'istruzione try-catch. Per un esempio di ricorsione che non raggiunge un errore stackoverflow entro 1 secondo, sono necessari esempi più oscuri come stackoverflow.com/q/12438786/3371119
them(() => 'C')
non provocherebbe un errore perché quando l'avversario chiama them
, chiama la () => 'C'
funzione. L'unica cosa che deve essere racchiusa try-catch
sarebbe se si chiama them
con un parametro di una funzione che chiama them
con un parametro di una funzione che chiama them
ecc. (All'infinito). Ad esempio, them(t => t(() => 'C'))
giocherebbe qualunque cosa l'avversario giocherebbe se l'avversario pensasse di giocare nice
. Non è possibile alcun stackoverflow
errore.