Resultados (22 de maio de 2017 21:40:37 UTC)
Master
venceu 18 rounds, perdeu 2 rounds e empatou 0 rounds
Save One
ganhou 15 rounds, perdeu 3 rounds e empatou 2 rounds
Machine Gun
venceu 14 rounds, perdeu 3 rounds e empatou 3 rounds
Monte Bot
ganhou 14 rounds, perdeu 3 rounds e empatou 3 rounds
Amb Bot
ganhou 12 rodadas, perdeu 8 rodadas e empatou 0 rodadas
Coward
venceu 11 rodadas, perdeu 3 rodadas e empatou 6 rodadas
Pain in the Nash
venceu 11 rodadas, perdeu 9 rodadas e empatou 0 rodadas
Nece Bot
venceu 10 rodadas, perdeu 7 rodadas e empatou 3 rodadas
Naming Things is Hard
venceu 10 rodadas, perdeu 7 rodadas e empatou 3 rodadas
The Procrastinator
venceu 10 rodadas, perdeu 8 rodadas e empatou 2 rodadas
Yggdrasil
venceu 10 rodadas, perdeu 10 rodadas e empatou 0 rodadas
Simple Bot
venceu 9 rodadas, perdeu 4 rodadas e empatou 7 rodadas
Table Bot
venceu 9 rodadas, perdeu 6 rodadas e empatou 5 rodadas
Prioritized Random Bot
venceu 8 rodadas, perdeu 7 rodadas e empatou 5 rodadas
Upper Hand Bot
venceu 7 rounds, perdeu 13 rounds e empatou 0 rounds
Aggressor
venceu 6 rounds, perdeu 10 rounds e empatou 4 rounds
Insane
venceu 5 rounds, perdeu 15 rounds e empatou 0 rounds
The Ugly Duckling
venceu 4 rounds, perdeu 16 rounds e empatou 0 rounds
Know Bot
ganhou 3 rounds, perdeu 14 rounds e empatou 3 rounds
Paranoid Bot
venceu 0 rounds, perdeu 19 rounds e empatou 1 round
Panic Bot
ganhou 0 rounds, perdeu 19 rounds e empatou 1 round
Infelizmente, não pude testar o Crazy X-Code Randomess porque não consigo fazê-lo rodar do bash no Linux. Incluí-lo-ei se puder fazê-lo funcionar.
O jogo
Este é um jogo KoTH muito simples. É uma luta individual de bolas de neve. Você tem um recipiente inicialmente vazio que pode suportar k
bolas de neve. Você pode se esquivar às j
vezes. A cada turno, os dois jogadores são convidados a escolher simultaneamente o que fazer. Existem três movimentos:
- recarregar: fornece outra bola de neve (até
k
) - throw: lança uma bola de neve, que mata o outro jogador se ele decidir recarregar. Se os dois jogadores jogam uma bola de neve, ninguém morre (eles têm uma mira tão boa que atingem as bolas de neve um do outro)
- duck: não faz nada e evita ser atingido se o outro jogador jogar uma bola de neve. Se você não tiver mais patos sobrando, nada acontecerá e se o outro jogador jogar uma bola de neve, você morre.
Objetivo
Não morra.
Especificações do desafio
Seu programa pode ser escrito em qualquer idioma. Você deve considerar cada uma dessas variáveis como argumento em cada execução:
[turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs]
turn
- quantas voltas se passaram ( 0
na primeira iteração)
snowballs
- quantas bolas de neve você tem
opponent_snowballs
- quantas bolas de neve o oponente possui
ducks
- quantas vezes mais você pode se esquivar
opponent_ducks
- quantas vezes o oponente pode se esquivar
max_snowballs
- o número máximo de bolas de neve que você pode store ( k
)
A saída da função de tecla deve ser 0
para recarregar, 1
jogar e 2
pato. Você deve enviar sua jogada, nova linha finalizada. Por favor, não produza movimentos inválidos, mas o controlador é muito resiliente e não será interrompido se você produzir movimentos inválidos (mesmo que seu movimento não seja nem um número inteiro). Ele deve ser finalizado com nova linha. Se a movimentação não estiver ativada [0, 1, 2]
, ela será padronizada para 0
. O vencedor será decidido como o jogador com mais vitórias em um torneio completo de rodízio.
Regras
Você pode ler / gravar de / para um arquivo para armazenamento de memória entre iterações. Seu bot será colocado em seu próprio diretório para que conflitos de nome de arquivo não ocorram. Você não pode alterar funções internas (como o gerador aleatório). Foi bem engraçado a primeira vez que foi feito , mas não será mais. Seu programa não tem permissão para fazer coisas que são apenas descaradas na execução. Aplicam-se brechas padrão .
Teste
O código fonte do controlador pode ser encontrado aqui . Exemplo de execução: java Controller "python program1/test1.py" "python program2/test2.py" 10 5
para 10 bolas de neve e 5 patos.
A julgar
O vencedor será decidido selecionando a pessoa com mais vitórias após um round-robin completo. Enquanto isso estiver empatado, remova todas as pessoas que não tiverem mais vitórias. Em seguida, repita até uma pessoa vencer. O padrão de julgamento será de 50 bolas de neve e 25 patos.
Coisa feliz!
EDIT : O jogo será declarado empate se passarem 1000 rodadas. Seu bot pode assumir isso turn < 1000
.
fonte
Respostas:
Mestre, C #
Treinei uma pequena rede neural (usando Sharpneat ). Parece gostar de pegar bolas de neve e se esquivar ...
Em uma versão anterior do controlador, ele até encontrou um bug. Passou de 0% a 100% quando descobriu como vencer trapaceando.
Edit: Eu esqueci de redefinir o estado interal das redes e treinei a rede errado. A rede recém treinada é muito menor.
fonte
Salvar um, Python
Lança a maioria de suas bolas de neve imediatamente, mas sempre salva uma no caso de o oponente estar atento à falta de munição. Em seguida, ele abaixa o maior tempo possível (novamente, salvando 1) antes de recarregar, a menos que haja uma recarga segura garantida ou uma morte garantida.
fonte
PrioritizedRandomBot, Java
Esse bot seleciona um número inteiro aleatório no intervalo
0
paraos + od
e, em seguida, escolhe lançar, desviar ou recarregar, com os limites determinados pelo número atual de bolas de neve e patos.Uma coisa que é importante perceber é que, uma vez que um bot tem mais bolas de neve do que o outro bot tem bolas de neve + patos, você pode forçar uma vitória. A partir disso, podemos chegar ao conceito de "pontos":
Se qualquer um desses números se tornar positivo, esse jogador poderá forçar uma vitória.
A tabela "diferença de pontos" forma a base da teoria dos jogos para esta competição. Ele não captura todas as informações, mas mostra como as bolas de neve são fundamentalmente mais valiosas do que os patos (como bolas de neve são ataque e defesa). Se o oponente joga uma bola de neve e você se abaixa com sucesso, você está um passo mais perto de uma vitória forçada, pois seu oponente usou um recurso mais valioso. Esta tabela também descreve o que você deve fazer em muitos casos especiais, como quando determinadas opções de movimentação não estão disponíveis.
A tabela "soma dos pontos" mostra como, com o tempo, a soma dos pontos se aproxima de zero (quando os dois jogadores ficam sem patos), momento em que o primeiro jogador comete um erro (recarrega quando não precisava) imediatamente perde.
Agora, vamos tentar estender essa estratégia de força a casos em que ela não é realmente forçada (como em, estamos vencendo por uma grande margem, mas a leitura da mente por parte do oponente nos vencerá). Basicamente, temos
s
bolas de neve, mas precisamos fazer bolas de neve com o tempo de nosso oponentes+1
(ous+2
etc.) consecutivamente para vencer. Nesse caso, queremos executar alguns patos ou algumas recargas para ganhar algum tempo.No momento, esse bot sempre tenta esgueirar-se em alguns patos, simplesmente porque, portanto, não corre o risco de perder: assumimos que o oponente está seguindo uma estratégia semelhante de arremessar tantas bolas de neve quanto possível; perigoso. Além disso, para evitar a previsibilidade, queremos escondê-las seguindo uma distribuição aleatória uniforme: a probabilidade de se esquivar está relacionada a quantos patos precisamos executar em relação ao número de bolas de neve que precisamos lançar.
Se estamos perdendo muito, nesse caso
s + d < os + od
, precisamos nos esgueirar em algumas recargas, além de usar todos os nossos patos; nesse caso, queremos recarregar aleatoriamente, mas apenas quantas vezes for necessário.É por isso que nossos bots priorizam na ordem de arremessar, desviar e recarregar e usam
os + od
para gerar o número aleatório, já que esse é o número limite de movimentos que precisamos fazer.Há um caso de borda e dois outros casos especiais que o bot atualmente lida. O argumento principal é quando o oponente não tem bolas de neve nem patos, e assim a aleatoriedade não funciona, então jogamos se possível, caso contrário, recarregamos. Um outro caso especial é quando o oponente não pode recarregar e, portanto, não há benefício em arremessar (já que o oponente se abaixa ou arremessa), então sempre nos abaixamos (já que salvar nossas bolas de neve é mais valioso do que salvar nossos patos). O caso especial final é se o oponente não tiver bolas de neve; nesse caso, jogaremos com segurança e recarregaremos, se possível.
fonte
NeceBot - Python
Aqui está a tabela de teoria dos jogos para o jogo:
Onde
~
significa que nenhuma vantagem,W
é ganhar,L
é perder,+-S
significa que uma bola de neve é ganha / perdida sobre o oponente e+-D
significa que um pato é ganho / perdido sobre o oponente. Este é um jogo completamente simétrico.Observe que minha solução não leva essa tabela em consideração. Porque eu sou ruim em matemática.
Chama-se NeceBot porque tenta reduzir o que é necessário primeiro. Após algumas estratégias arbitrárias, espero que funcione.
fonte
<3
s lol. +1 por ter uma mesa de jogo e depois não usá-la: P Mas boa solução :) #3 + opponent_snowballs <3
isso pode ser um erro?<3
s tornar o código muito difícil de entender :(Covarde - Scala
Arremessos, se o oponente não tiver munição, caso contrário (em ordem de prioridade) os patos, arremessos ou recarregamentos.
fonte
TheUglyDuckling - Python
Sempre se abaixará até que não possa tentar jogar se o oponente estiver vazio ou recarregar se ambos estiverem vazios. Usará recarregar como último recurso.
fonte
SimpleBot - Python 2
Coisas simples.
fonte
O bot de nomear as coisas é difícil - VB.NET
Nomear as coisas é difícil, e não tenho certeza se tenho uma estratégia coesa para nomear isso.
Tenta apostar nas primeiras rodadas para obter uma vitória antecipada. Depois disso, joga mais seguro o resto do tempo, tentando vencer por atrito.
fonte
MachineGun, Python 3
Tenta economizar bolas de neve até que seja garantido que ele mata o oponente ou até que fique sem patos (nesse caso, ele começa a atirar cegamente todas as bolas de neve, como uma metralhadora)
Também se esquiva sempre que o oponente tem uma bola de neve, porque não quer morrer.
fonte
Knowbot, Python3
Mantém a freqüência dos movimentos anteriores, assume que o oponente fará o mais frequente novamente, se defende contra isso.
** Atualizado para não esperar movimentos que o oponente não pode fazer **
fonte
Braingolf , o agressor
O agressor não é covarde! Se ele tem uma bola de neve, ele deve jogar! Se ele não tiver bolas de neve, ganhará mais!
Braingolf , O Insano
Na verdade, não é um bot, é apenas um programador que sequestrei e forcei a portar todos os projetos que ele já fez para braingolf. Ele não tem mais um pingo de sanidade.
Gera um número aleatório menor que 3 e produz
t % r
onde t é o turno atual er é o número aleatórioPara executá-las, você precisará fazer o download
braingolf.py
no github, salvar o código braingolf em um arquivo e executarou simplesmente insira o código diretamente assim
As entradas são irrelevantes, desde que o segundo argumento após o código / nome do arquivo seja a quantidade de bolas de neve que o agressor possui.
Nota: O agressor realmente se comporta de forma idêntica ao TestBot, eu só queria fazer uma entrada no braingolf
Braingolf , o inteligente [quebrado agora]
fonte
TestBot - Python
Este é um envio de teste para mostrar como pode ser um envio válido. A estratégia: Recarregar e jogar alternadamente. Uma estratégia bastante ruim, mas fornece uma idéia de como seu programa deve funcionar.
fonte
_, turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs = sys.argv
os argumentos?sys.argv[1:]
se você não quer mexer com isso_
UpperHandBot, Python 3
Este bot tenta coletar mais bolas de neve que seu oponente e, nesse ponto, começa a jogar. Se em algum momento o UHB não tiver mais bolas de neve do que seu oponente, ele:
fonte
Yggdrasli, Java
Chamei esse bot de "Yggdrasil" porque, na verdade, olha para baixo na árvore do jogo e executa a avaliação do estado, a partir da qual ele pode calcular uma estratégia mista aproximadamente ideal. Por se basear em estratégias mistas, é muito não determinístico. Eu não sei o quão bem isso vai ser na competição real.
Algumas coisas sobre este bot:
fonte
Dor no Nash (C ++)
Assim chamado porque o fato de eu ter que escrever meu próprio solucionador de equilíbrio de Nash era uma verdadeira dor. Estou surpreso que não haja bibliotecas de resolução de Nash prontamente disponíveis!
Compile como C ++ 11 ou melhor. Para desempenho, é bom compilar com o suporte ao OpenMP (mas isso é apenas para velocidade; não é necessário)
Isso usa o equilíbrio de Nash para decidir o que fazer em cada turno, o que significa que, em teoria , sempre vencerá ou empatará a longo prazo (em muitos jogos), independentemente da estratégia que o oponente use. Se esse é o caso na prática, depende de eu ter cometido algum erro na implementação. No entanto, como essa competição de KoTH tem apenas uma rodada contra cada oponente, provavelmente não se sairá muito bem na tabela de classificação.
Minha idéia original era ter uma função de avaliação simples para cada estado do jogo (por exemplo, cada bola vale + b, cada pato é + d), mas isso leva a problemas óbvios para descobrir quais devem ser essas avaliações e significa que elas não podem ajude com retornos decrescentes de reunir mais e mais bolas, etc. Então, em vez disso, isso analisará toda a árvore do jogo , trabalhando para trás a partir do turno 1000, e preenche as avaliações reais com base em como cada jogo pode dar certo.
O resultado é que eu não tenho absolutamente nenhuma idéia de qual estratégia isso usa, exceto por alguns comportamentos "óbvios" codificados (jogue bolas de neve se você tiver mais bolas do que seu oponente tem bolas + patos e recarregue se você estiver fora bolas de neve). Se alguém quiser analisar o conjunto de dados que produz, imagino que haja algum comportamento interessante a descobrir!
Testar isso contra o "Save One" mostra que ele realmente vence a longo prazo, mas apenas por uma pequena margem (514 vitórias, 486 derrotas, 0 empates no primeiro lote de 1000 jogos e 509 vitórias, 491 derrotas, 0 empates no segundo).
Importante!
Isso funcionará imediatamente, mas não é uma ótima idéia. Demora cerca de 9 minutos no meu laptop com especificações moderadas de desenvolvedor para gerar a árvore completa do jogo. Mas ele salvará as probabilidades finais em um arquivo, uma vez geradas, e depois disso cada turno estará gerando um número aleatório e comparando-o com 2 bytes, por isso é super rápido.
Para atalho, basta baixar este arquivo (3,5 MB) e colocá-lo no diretório com o executável.
Ou você pode gerá-lo executando:
O que salvará um arquivo por turno, até a convergência. Observe que cada arquivo tem 3,5 MB e convergirá na curva 720 (ou seja, 280 arquivos, ~ 1 GB) e, como a maioria dos jogos não chega nem perto da curva 720, os arquivos de pré-convergência têm uma importância muito baixa.
fonte
Swift - TheCrazy_XcodeRandomness
Infelizmente, isso só pode ser executado localmente, no Xcode, porque contém o
Foundation
módulo e sua funçãoarc4random_uniform()
. No entanto, você pode dizer qual é o algoritmo:fonte
swift
comando e verifique se ele funciona.Foundation
, desculpe: /TableBot, Python 2
Chamado TableBot porque foi criado com a implementação desta tabela:
Um 1 representa ter 1 ou mais, um 0 representa não ter nenhum.
O bot:
Experimente online!
fonte
AmbBot - Esquema de raquete
Eu queria experimentar
amb
, porque é legal. Esse bot ordena aleatoriamente as opções (recarregar, jogar e desviar), filtra aquelas que não fazem sentido e escolhe a primeira opção. Mas comamb
, podemos usar continuações e backtracking!Também fiz um pequeno programa de teste para executar dois desses bots um contra o outro. Parece que o segundo bot vence mais vezes, então eu posso ter cometido um erro em algum lugar.
fonte
MonteBot, C ++
Basicamente, peguei o código deste koth e o modifiquei para esse desafio. Ele usa o algoritmo de pesquisa de árvore desacoplada UCT Monte Carlo. Deve estar bem próximo do equilíbrio nash.
Instruções de compilação para linux:
Salve em
MonteBot.cpp
.Corra
g++ -o -std=c++11 MonteBot MonteBot.cpp
.Comando para executar:
./MonteBot <args>
fonte
O procrastinador - Python 3
O procrastinador procrastinará jogando salvando as duas primeiras rodadas. De repente, o monstro do pânico quer evitar perder a guerra de recursos, combatendo os movimentos mais usados pelos oponentes.
fonte
ParanoidBot e PanicBot - ActionScript3 ( RedTamarin )
A partir de uma linguagem de nicho inadequada (com extensões para fornecer argumentos de linha de comando), o ParanoidBot é um aranjo e seu aliado insípido, o PanicBot.
ParanoidBot
O ParanoidBot está enlouquecendo e tem uma estratégia desnecessariamente específica da qual confiar. Primeiro, ele lança bolas de neve até atingir um limite, mantendo alguns em reserva. Depois de três patos de advertência, a paranóia se instala e o bot tenta estocar mais bolas de neve entre os patos aleatórios. Após reabastecer seu suprimento, o ParanoidBot volta a jogar cegamente. Devido às vozes em sua cabeça, o ParanoidBot pode dizer se é garantido que ele ganha ou perde e irá "criar estratégias" de acordo.
Suspensórios são um pouco vacilantes para ajudar a condensar o tamanho
PanicBot
Já tendo enlouquecido, o PanicBot reage por medo instintivo. Depois que os patos ficam sem medo, o PanicBot joga cegamente todas as suas bolas de neve e, em seguida, desesperadamente faz e joga mais bolas de neve até que (provavelmente) seja derrotado.
Essa é uma das menos de 15 outras entradas usando o AS3 aqui no PPCG. Um dia, talvez essa linguagem indiscutivelmente exótica encontre um quebra-cabeça para dominar.
fonte
snow.as
, o seguinte deverá funcionar no bash:$ ./redshell snow.as -- 0 50 50 25 25
chmod +x redshell
é seu amigo aqui ...Defender, Python
Recarrega quando nenhum jogador tem bolas de neve. Se tiver bolas de neve, lança. Se não tiver bolas de neve, mas o oponente tiver, ele se abaixa, se puder, caso contrário, será recarregado.
Nota: ainda não testado
fonte