No futuro, quando a Viagem no tempo (abreviada como TT) for comum, o lançamento de moedas se tornará um esporte mental sério. Para nos prepararmos para o futuro, criamos uma competição para programas em que a viagem no tempo estará realmente acontecendo do ponto de vista das entradas.
A competição é um King of the Hill do estilo round-robin, que consiste em partidas de sorteio entre as classes Java.
Regras da partida de lançamento de moedas
- Existem dois jogadores e 100 rodadas.
- Em cada rodada, uma moeda é lançada e, com base no resultado, um dos jogadores ganha 1 ponto. Cada jogador tem 50% de chance de marcar um ponto.
- Após o lançamento, os dois jogadores têm a chance de controlar o tempo puxando as alavancas.
- Se você puxar uma alavanca azul (tampa de reversão), nenhum TT é possível para a rodada em que a alavanca foi usada ou em qualquer rodada anterior. A tentativa de TT de ir a essas rodadas não terá efeito.
- Se você puxar uma alavanca vermelha (reverter), tenta reverter o tempo para uma rodada anterior. Se for bem-sucedida, a memória do oponente será revertida para a memória antes da rodada escolhida e os resultados do sorteio a partir da rodada escolhida também serão excluídos . O único sinal possível para o seu oponente sobre o TT será o número de suas alavancas não utilizadas que não serão revertidas.
- Cada jogador tem 5 alavancas azuis e 20 vermelhas não utilizadas no início da partida. Essas alavancas não são afetadas pelos TTs.
- Se nenhum TT acontecer no final de uma centésima rodada, o jogo termina e o jogador com a pontuação mais alta vence.
Detalhes
- As rodadas têm uma indexação baseada em 1 (formulário 1 a 100).
- Antes da rodada,
x
você recebe o número de alavancas azuis e vermelhas disponíveis, o lançamento da moeda resulta até o turnox
(inclusive) e a memória da (última)x-1
quinta rodada. - Puxar uma alavanca azul na rodada
x
interrompe todos os TTs que têm um destino na rodadax
ou antes (ele bloqueia um TT se ocorrer também na mesma rodada exata). - Reverter para a rodada
x
significa que a próxima rodada será rodadax
. - Se ambos os jogadores optarem por reverter no final de uma rodada, o tempo será revertido para o destino anterior que não está bloqueado. O (s) jogador (es) que tentaram reverter para este momento manterão sua memória.
Detalhes técnicos
- Você deve escrever uma classe Java implementando a interface Bot fornecida.
- Adicione seu bot ao projeto.
- Adicione uma instância do seu Bot ao
Bot
arquivoController.java
. - Sua turma não deve manter informações entre as chamadas . (Na maioria dos casos, ter apenas
final
variáveis fora das funções atende a esse requisito.) - Você pode fornecer informações ao controlador no
memory
campo do seuAction
objeto retornado . Este valor será devolvido a você no próximo turno, se não houver TT. Se um TT acontecer, você receberá a memória anterior correspondente. - Você pode usar o
totalScore()
método daGame
classe para obter a pontuação de uma sequência do histórico.
Protocolo
A cada passo, seu
takeTurn(...)
método é chamado com 5 argumentos:- o número de alavancas azuis não utilizadas
- o número de alavancas vermelhas não utilizadas
- o histórico de lançamento de moedas, uma sequência de 1 e 0 marcando suas vitórias e derrotas nas rodadas anteriores. O primeiro caractere corresponde ao primeiro lançamento da moeda. (Na primeira rodada, o comprimento da corda será
1
.) - uma string, sua memória armazenada da rodada anterior
- o índice baseado em 1 desta rodada
A cada passo, seu método retorna um
Action
objeto que contémum número inteiro no
move
campo que descreve sua ação:0
para nenhuma ação-1
puxar uma alavanca azul e bloquear TT está passando por esta rodada- um número inteiro positivo
x
, não maior que a rodada atual, para puxar uma alavanca vermelha e tentar voltar à rodadax
- Inteiros inválidos são tratados como
0
.
uma string contendo sua memória desta rodada que você deseja preservar. Observe que armazenar memória não é uma parte crucial do desafio . Você pode fazer boas entradas sem armazenar dados úteis na string. Na primeira rodada, a sequência será uma sequência vazia.
Seu método não deve demorar mais que 10 ms por rodada, em média, em uma partida.
- A falha regular do prazo resulta na desqualificação.
Pontuação
- Ganhar uma partida ganha 2 pontos e um empate ganha 1 ponto para ambos os jogadores. A perda não ganha pontos.
- A pontuação de um bot será o número total de pontos coletados.
- O número de partidas disputadas entre cada par de participantes dependerá do número de participações e de sua velocidade.
Dois exemplos simples de bots são postados como respostas.
O controlador e o primeiro par de robôs estão disponíveis aqui .
Resultados dos testes com bots enviados até 3 de novembro:
Total de pontuações:
Oldschool: 3163
Random: 5871
RegretBot: 5269
Nostalgia: 8601
Little Ten: 8772
Analyzer: 17746
NoRegretsBot: 5833
Oracle: 15539
Deja Vu: 5491
Bad Loser: 13715
(O controlador é baseado no controlador do desafio Cat catcher . Obrigado por @flawr fornecê-lo como base para este).
Bônus: um belo filme de 6 minutos baseado em um conceito semelhante.
fonte
If you pull a blue lever (revert stopper) no TT is possible through that round anymore. TT's attempting to go through the round will have no effect.
O que é "passar por uma rodada"?If you pull a blue lever (revert stopper) no TT is possible to the round the lever was used or any earlier round anymore. TT's attempting to go to these rounds will have no effect.
Respostas:
Analisador
Isso analisa o passado para fazer as melhores previsões para o futuro.
EDIT: Evita tempos de alavanca azuis. Usa alavancas azuis efetivamente. Usa alavancas vermelhas de forma mais eficaz. Adicionado medo para a temporada de Halloween.
EDIT: Corrigido por 1 erro.
EDIT:
computeWinningProbability
Função aprimorada . Agora usa alavancas vermelhas e alavanca azul de forma mais agressiva.Pontuação (desde 2 de novembro):
fonte
Nostalgia
Não testado, apenas uma tentativa rápida de criar um bot difícil de bloquear (porque decide quando puxar a alavanca vermelha aleatoriamente), mas que toma decisões decentes.
Edit: Eu perdi esta regra:
Essa parece ser uma boa razão para usar a memória - se você se lembrar de tentar fazer o TT em uma determinada rodada, pode ter falhado; portanto, não deve tentar fazer o TT novamente nessa rodada. Editou meu bot para tentar evitar isso.
fonte
Oráculo
Copiei descaradamente algum código do Analyzer (para analisar a memória). Essa finalização tenta puxar uma alavanca azul mais cedo e, lentamente, aumenta sua liderança. Eu acho que o desempenho desse bot compensa o código feio :)
fonte
RegretBot
No final de
nossa vida,a partida, lamentamos nossas falhas passadas e tentamos voltar e corrigi-las.fonte
Little Ten
O Little Ten faz muita multiplicação e divisão por 10, usando números que são múltiplos de 10 e voltando às rodadas que são múltiplos de 10.
Edit: Mudou a mecânica um pouco agora que a explicação do que acontece quando uma alavanca azul é puxada é mais clara. Também fez um pouco de reequilíbrio.
fonte
Aleatória
A estratégia da Random é a seguinte:
fonte
NoRegretsBot
fonte
Mau perdedor
Esse bot não usa memória e é surpreendentemente bom (mas não supera o Analyzer ou o Oracle).
fonte
Moda antiga
Esse bot nunca realiza nenhuma ação, pois o Oldschool não acredita em viagens no tempo.
fonte
Deja Vu Bot
Este bot tenta rastrear quando puxa o azul para evitar puxar o vermelho para aquela região. Só puxará alavancas vermelhas quando estiver significativamente atrasado na pontuação.
fonte