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.
fonte
them
ser determinística / seguir as regras? Por exemplofunction 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 umStackOverflow
, 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/3371119them(() => 'C')
não resultaria em erro porque, quando o oponente pagathem
, chama a() => 'C'
função. A única coisa que precisa ser envolvidatry-catch
seria se você chamarthem
com um parâmetro de alguma função que chamathem
com um parâmetro de alguma função que chamathem
etc. (infinitamente). Por exemplo,them(t => t(() => 'C'))
jogaria o que o adversário jogaria se o adversário pensasse que estava jogandonice
. Não há possibilidade destackoverflow
erro.Respostas:
BoomBot
Se o oponente for o primeiro a correr e pagar sem
try..catch
, este bot ganha automaticamente 3 pontos. Zero pontos em qualquer outro caso.fonte
Archaeopteryx
cooperate
, imite o movimento do oponentedefect
.defect
ou comnice
, então o defeito.O que torna essa uma boa estratégia? Eu não faço ideia. Eu o criei usando um algoritmo evolutivo, treinado em parte nos envios atuais.
Tiktaalik
cooperate
, inverta o movimento do oponentedefect
.defect
, então defeito.notNice
.Outra estratégia gerada evolutivamente.
fonte
WhatWouldBotDoBot
WhatWouldBotDoBot é bastante simples; apenas testa seu oponente pelo que faria contra um programa em estado estacionário. Se um bot preferir cooperar, se possível, o WWBDB também preferirá a cooperação (por isso cooperará com o bot legal). O WWBDB não prefere a cooperação.
fonte
Verifique com estado
Se eles me invocarem, provavelmente serão realmente eles. Atuamos como desertor. Se eles não me chamarem, provavelmente serão um testador finalizado. Nós agiríamos como mais agradáveis.
Acima está a resposta original. E talvez eu deva me cooperar para ganhar mais pontos.
Verificar stateful com self-coop
fonte
RandomBot
Porque porque não?
fonte
Complexidade
Testes de complexidade para ver se o bot é Cooperar ou Defeito. Se for, ele coopera, mas se não for, ele falha. Todos os bots atuais que testam seus oponentes usam funções simples para testar as respostas, então a Complexidade apenas fingirá ser Cooperar nesses casos.
fonte
Como eu quero que isso funcione é sempre desertar, exceto quando estiver jogando contra si mesmo. Ele tenta fazer isso passando uma função "testador" que não está envolvida com eles e tenta detectar se "eles" é nomeado testador. Se ele for nomeado testador, ele alterará a variável estática ativada para true e retornará cooperar. Mas isso não funciona. Não estou muito familiarizado com javascript e provavelmente farei mais algumas alterações.
fonte
tester
função: DNão é legal
Imita a reação do oponente à deflexão
fonte
NotNice 2
Versão à prova de crescimento do NotNice por FatalError .
fonte
Senso comum
Disclaimer: Eu meio que não sei javascript.
Se você pode lucrar com uma pessoa legal, faça-o. Caso contrário, devolva o que eles retornariam se se enfrentassem cooperando (pelo menos, é o que eu acho que faz).
fonte
E você, onde você quer ir? (inspirado pelas tensões no livro da selva)
fonte
this
é o mesmo que self. Eu acho que você queria dizerreturn them(yourself)
.this
não é uma variável, é uma palavra-chave e no contexto de uma funçãothis!=self
.self
significaria o objeto da janela ethis
a própria função (sempre se refere ao contexto em que se encontra, é por isso que não é considerado uma variável). É por isso que tervar self = this;
no início de muitos exemplos de código pode ser considerado enganoso. Versão adicionada sem o "this"this
Não se refere à função.yourself
eyourself_no_this
executar variam de maneira diferente.this
basicamente nunca se refere à função em javascript. Veja: developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…Punir os inspetores
Dê ao bot algum código e veja se ele é executado. Se foi executado mais de uma vez, o bot é um inspetor do mal, e devemos desertar! Se foi executado exatamente uma vez, jogue como um bot não muito bom. Se nunca foi executado, coopere.
História
Qual seria o último bot que eu vi fazer contra esse oponente?
Resultados para um torneio de 10000 rounds:
fonte
Mal tenta determinar se está dentro de uma simulação ou não. Nesse caso, ele assume que, eventualmente, será passado o código real
them
e tenta várias estratégias para convencê-los a cooperar.Se não tiver certeza, verifica se pode desertar gratuitamente ou, se não, tenta copiar o
them
que faria quando recebesse um colaborador.fonte
TrickyBot
Tente ser imprevisível
fonte
aplicar automaticamente
Não tenho certeza se faz algum sentido, mas parece interessante! Faça como você, repita para pegar a aleatoriedade. Se isso não funcionar, seja legal.
Não testado e meu primeiro código javascript, e mais complexo do que eu esperava.
fonte
selfapply(selfapply)
chamaselfapply(selfapply)
!RandomAlternate
Então eu aprendi como usar propriedades para estado ...
fonte
Bot de assassinato # 1
Causa um loop infinito pelo qual é mais provável que o oponente seja responsabilizado.
fonte
The Platinum Rule Bot
A regra da platina declara "Trate os outros da maneira que eles querem ser tratados". Meu bot acomoda isso. O que quer que eles façam a si mesmos, o que assumimos é como eles gostariam de ser tratados, nós fazemos a eles. Se eles lançarem um erro, assumimos que eles querem cooperar.
fonte
TheGolfedOne (nome da função:)
a
, 63 bytesCódigo de golfe é difícil de ler. Por causa disso,
them
vai quebrar.Eu não entendia completamente a mecânica deste KotH, mas suponho que se o oponente for apátrida, eu só preciso quebrá-lo enquanto desertar.
O resultado do seu primeiro torneio (não me incomodei em usar todos os bots, desculpe)
Ele não está indo tão mal quanto eu pensava, o 3º lugar (entre aqueles) na primeira tentativa.
Segunda tentativa,
a
conseguiu 260 novamente, terceiro lugar novamente, atrásonlyTrustYourself
edefect
novamente. Pode ser consistente no final :)PS: Eu não sou tão bom com golfe, então é mais uma brincadeira do que qualquer coisa. Aqui, apenas reduzi os nomes das variáveis, o nome da função e removi o máximo de espaço em branco possível.
fonte
Carma
Se o oponente cooperar conosco, cooperaremos. Se eles tentarem desertar quando cooperamos, nós também desertaremos.
fonte