Neste desafio, você escreverá um bot que é o dilema do prisioneiro. Aqui está o problema: você não terá acesso ao histórico dos jogos anteriores. Em vez disso, você terá acesso ao próprio oponente. Nesta versão, os dois jogadores ganham +2 pontos se cooperarem, +1 pontos se ambos desertarem, e se um coopera mas um falha, o desertor recebe +3 enquanto o outro não ganha pontos. Cada envio será jogado contra todos os outros envios, incluindo a si próprio, 10 vezes. O vencedor é a finalização com o maior número de pontos.
Controlador : você deve escrever uma função javascript, no formato
function submissionName(them) {
/* Your code here */
}
O controlador usa a name
propriedade da função para exibir os resultados; portanto, se não estiver nesse formato (e estiver f = x => ...
ou f = function() { ... }
), será difícil ver sua pontuação e você não poderá acessar sua própria função.
A função aceitará um parâmetro: them
qual é a função do oponente. Pode então chamar essa função para ver qual a reação do oponente receberia determinadas funções como entradas. Com base nesses dados, você deve retornar 'C' ou 'D' para cooperar ou defeito, respectivamente.
Exemplos (estarão competindo):
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'));
}
O controlador está disponível aqui
Regras :
- Você não poderá ver o próprio código do oponente. Todas as funções são agrupadas para que tenham a mesma aparência quando
toString()
chamadas. A única maneira de examinar um oponente (quem poderia ser você mesmo) é testá-lo. - Sua função não precisa ser determinística. Você só pode salvar o estado definindo propriedades em sua própria função, como
submissionName.state = {};
. No entanto, entre partidas (mesmo entre partidas dos mesmos jogadores), o estado é limpo ao chamartoString()
eeval
. Portanto, não há memória de correspondências anteriores. - A ordem de qual função é chamada primeiro em cada correspondência é aleatória.
- Se seu código gerar um erro, ele será tratado como se você cooperasse enquanto seu oponente desertou. Se você é o primeiro a correr, o código do oponente nem será chamado. Isso acontece mesmo se o erro ocorrer no código do seu oponente enquanto você estiver pagando
them
. Cuidado com os erros de estouro de pilha, especialmente se o seu código chamarthem(wrap(submissionName))
, pois eles podem fazer o mesmo. - Você não pode acessar a variável
self
ou qualquer outra variável que esteja no escopo quandoeval
for chamada EXCEPT the functionwrap
. Esta função permite que você chame o oponente de uma maneira indistinguível de como o controlador chama uma função. Você não pode escrever paraMath
,window
etc. (Você pode usar funções comoMath.random()
, no entanto). - Você não pode acessar o rastreamento de pilha criando um
Error
ou por outro método.
Uma observação sobre a demora: evite ficar preso em um while
loop para sempre. O tempo combinado de ambos os competidores não deve exceder 1 segundo em qualquer rodada. Para impor isso, um intervalo aleatório entre 1000 ms e 2000 ms é escolhido (para evitar jogos, intencionalmente, aguardando uma quantidade conhecida de tempo) e, se o trabalhador demorar mais do que isso para executar, será gerado um erro. Se isso acontecer, a causa do erro será determinada da seguinte forma: a execução será pausada em um momento aleatório após 1000 ms e a pilha de chamadas naquele momento será inspecionada. O competidor mais recentemente chamado que está atualmente em um loop (ou recursão do tipo loop, no sentido de que é uma recursão configurada para evitar um erro de estouro de pilha) será responsabilizado. Se o mesmo competidor for responsabilizado por causar um erro de "demora demais" várias vezes, esse competidor será desqualificado.
them
ser determinística / seguir as regras? Por exemplo function me(them){let log=0;them(x=>{++log;return 'C';})
, log de retorno == 0? 'D': 'C';}
StackOverflow
erro e não em um loop infinito que nunca termina. Se isso resultar em um StackOverflow
, certifique-se de adicionar uma instrução try-catch. Para um exemplo de recursão que não chegar a um erro stackoverflow dentro de 1 segundo, você precisa de exemplos mais obscuros como stackoverflow.com/q/12438786/3371119
them(() => 'C')
não resultaria em erro porque, quando o oponente paga them
, chama a () => 'C'
função. A única coisa que precisa ser envolvida try-catch
seria se você chamar them
com um parâmetro de alguma função que chama them
com um parâmetro de alguma função que chama them
etc. (infinitamente). Por exemplo, them(t => t(() => 'C'))
jogaria o que o adversário jogaria se o adversário pensasse que estava jogando nice
. Não há possibilidade de stackoverflow
erro.