NOTA: No momento, esse desafio está encerrado, pois não consigo instalar os idiomas necessários para executar uma correspondência. Se alguém tiver tempo e interesse para fazê-lo, não sou contra.
Veja a parte inferior da postagem para uma tabela de classificação.
Este é um desafio semi-cooperativo do tipo rei da colina, onde os bots constroem caminhos através de um gráfico de grade bidimensional. O bot que controla os nós com mais tráfego é o vencedor. No entanto, são necessários mais recursos de um bot para criar um caminho de conexão, de modo que os bots terão que trabalhar juntos - até certo ponto.
Jogabilidade
A seguir, N > 0
seja o número de bots em jogo.
The Grid
O jogo é jogado em uma grade inteira bidimensional de tamanho , cuja coordenada inferior esquerda está em . Cada coordenada com tem bordas de saída para as três coordenadas , e, por cima, onde os -coordena são tomadas módulo . Isso significa que a grade envolve as bordas leste e oeste. Todas as coordenadas inferiores são uma fonte e todas as coordenadas superiores são um coletor .⌊4/3N2⌋ × ⌊4/3N2⌋
(0,0)
(x,y)
0 ≤ y < ⌊4/3N2⌋-1
(x-1,y+1)
(x,y+1)
(x+1,y+1)
x
⌊4/3N2⌋
(x,0)
(x,⌊4/3N2⌋-1)
A figura a seguir mostra uma 8 × 8
grade.
Cada vértice do gráfico está inativo , ativo ou quebrado . Todos os vértices começam inativos e podem ser ativados por bots, que serão seus proprietários. Além disso, os bots podem quebrar os vértices e não podem ser reparados.
Ordem de volta
Um turno consiste em uma fase de destruição e uma fase de ativação . Na fase de destruição, cada bot pode quebrar um vértice inativo. Esse vértice é quebrado a partir de então e não pode ser ativado por ninguém. Na fase de ativação, cada bot pode ativar um vértice inativo. A partir de então, eles possuem esse vértice, e ele não pode ser reativado por mais ninguém. Vários bots podem possuir um único vértice, se todos o ativarem no mesmo turno. Em cada fase, as seleções de vértices são feitas simultaneamente.
Pontuação
Uma rodada dura exatamente para as voltas. Depois disso, a rodada é pontuada da seguinte forma. A partir de cada vértice de origem ativa, realizamos uma pesquisa aleatória de profundidade ao longo dos vértices ativos (o que significa que os filhos de cada vértice são visitados em uma ordem aleatória). Se um caminho for encontrado da fonte para algum coletor, para todos os vértices ao longo desse caminho, todo proprietário do vértice receberá um ponto.N2
N
O jogo inteiro dura 100 rodadas, e o bot com mais pontos no total é o vencedor. Eu posso aumentar esse número, se a variação das pontuações for muito alta.
Regras adicionais
- Sem mexer com o controlador ou outros envios.
- No máximo uma inscrição por participante.
- Nenhum recurso externo, exceto um arquivo de texto privado, foi limpo no início do jogo.
- Não projete seu bot para vencer ou apoiar oponentes específicos.
- Forneça comandos para compilar e executar seu bot. Qualquer compilador / intérprete disponível gratuitamente para o Debian Linux é aceitável.
O controlador
O controlador é escrito em Python 3 e pode ser encontrado no GitHub . Consulte o arquivo LEIA-ME para obter instruções detalhadas. Aqui está uma API para você começar:
- Os robôs são iniciados no início de cada rodada e persistem até o final da rodada. A comunicação com o controlador via STDIN e STDOUT, usando mensagens terminadas em nova linha.
BEGIN [num-of-bots] [num-of-turns] [side-length]
é inserido no início.DESTROY [turn]
é inserido no início de cada fase de destruição. Seu bot deve responder comVERTEX x,y
a escolha de um vértice, ouNONE
.BROKEN [turn] [your-choice] [other-choices]
é inserido no final de cada fase de destruição. A ordem dos outros bots é aleatória no início de cada jogo, mas permanece fixa durante o mesmo. As opções são apresentadas comox,y
ouN
.ACTIVATE [turn]
eOWNED [turn] [your-choice] [other-choices]
são os equivalentes dos itens acima para a fase de ativação e têm a mesma semântica.SCORE [your-score] [other-scores]
é inserido no final do jogo.- Seu bot tem 1 segundo para analisar os resultados de uma fase e escolher o próximo vértice e 1 segundo para sair após receber a pontuação. Vou testar os envios no meu laptop relativamente antigo, por isso é melhor deixar alguma margem aqui.
Lembre-se de liberar seu buffer de saída. Não fazer isso pode travar o controlador em alguns ambientes.
Entre os melhores
Atualizado 13/3/2015
O Peacemaker está em funcionamento e o Funnelweb também recebeu uma atualização. As pontuações aumentaram em uma ordem de magnitude. O conector excedeu o limite de tempo em dois jogos.
Funnelweb: 30911
Connector: 18431
Watermelon: 3488
Annoyance: 1552
Explorer: 735
Checkpoint: 720
Random Builder: 535
FaucetBot: 236
Peacemaker: 80
O log completo com gráficos artísticos ASCII pode ser encontrado no repositório do controlador, em graphical_log.txt
.
Algumas observações:
- O conector pode ser facilmente interrompido quebrando um único vértice na frente dele. Suspeito que o Aborrecimento frequentemente faça isso. No entanto, atualmente faz pouco sentido, porque apenas o Connector pode criar um caminho.
- A melancia pode obter uma pontuação decente simplesmente por estar em um caminho de conexão (já que é muito provável que o DFS use seus vértices).
- O Explorer gosta de cultivar videiras das melancias.
- A Funnelweb atualizada obtém pontuações muito boas, pois o Connector geralmente se prende a ela na metade inferior da grade.
- Os jogos estão ficando muito longos, a rodada média leva cerca de 25 segundos na minha máquina.
4/3*N^2
e, mesmo lá, os bots tiveram problemas para formar caminhos válidos. No entanto, o Connector foi temporariamente desqualificado devido a um erro e agora que foi corrigido, espero que os jogos sejam mais interessantes. Vou correr outro lote hoje à noite.Respostas:
Conector (Java)
Tenta criar um caminho em uma posição aleatória. Como ele não pode criar um caminho por si só, ele procura células ativas e as usa. O crédito é para Geobits, de quem eu roubei algum código. Além disso, esse envio ainda não foi concluído, pois simplesmente deixa de fazer qualquer coisa assim que o caminho é construído.
Editar: se um caminho for criado, o Connector tentará criar vários caminhos ao longo do existente.
fonte
java.lang.ArrayIndexOutOfBoundsException: -1 at Connector.findExtendingPathPoint(Connector.java:166)
.Funnelweb, Python 2
versão 1.2 - Melhor código de junção, nova animação adicionada
Nomeado após uma das aranhas menos amigáveis da Austrália. Esse bot primeiro cria um ninho em forma de funil nas linhas superiores e depois atrai outros bots para a criação de caminhos para o tráfego no ninho.
Aqui está uma nova animação de um jogo de 6 bot em um tabuleiro 4 / 3N ^ 2 mostrando a barra de funil e alguns bots mais simples:
O código Python do funnelweb:
A aranha é executada com
python funnelweb.py
.fonte
Ponto de verificação, Java
Este bot tenta criar pontos de verificação para que qualquer caminho válido passe por um dos meus vértices. Uma vez que existem N 2 voltas ea placa é 2N 2 transversalmente, eu posso ativar / quebrar cada nó em uma única linha horizontal (supondo que eu estou lá primeiro). Faça isso em um padrão alternado (
x
está quebrado,o
é meu):Se você quiser fazer um caminho, precisará passar pelos meus pontos de verificação :)
Agora, existem vários problemas que isso pode enfrentar. Primeiro, não vai funcionar muito bem, a menos que haja muitos caminhos. Como ele próprio não faz nenhum caminho produtivo, ele realmente depende totalmente de alguns concorrentes. Mesmo alguns concorrentes combinando para fazer um único caminho não ajudarão muito, já que ele apenas marca um ponto para cada caminho encontrado. O que ele precisa para brilhar é provavelmente alguns bots fazendo caminhos diferentes. Mesmo assim, pode não ter uma pontuação muito alta, mas foi uma ideia que tive no bate-papo, então ...
Se um dos espaços na linha já estiver bloqueado / reivindicado, basta procurar um local próximo que possa usar (de preferência na mesma
x
linha, apenas deslocado verticalmente).Para compilar, é
javac Checkpoint.java
. Para correrjava Checkpoint
. Você deseja adicionar / alterar o caminho para refletir onde quer que esteja.fonte
Melancia, Java
Tentativas de desenhar melancias na grade.
fonte
FaucetBot (em R)
Cria um gargalo na segunda linha e ativa os nós no caminho atrás dela.
Se eu não estragar tudo, a configuração final deve ser algo como:
Comando é
Rscript FaucetBot.R
.fonte
Pacificador, Java
Baseado no código de Manu.
Os pacificadores buscam zonas de conflito (ou seja, a maioria das concentrações de vértices QUEBRADOS ou ATIVOS) e ativam um vértice aleatório próximo.
fonte
while
loop doactivate
método. Você interrompe a pesquisa depois de encontrar um vértice que não é seu e não está quebrado - mas ele pode pertencer a outra pessoa e, portanto, não é possível ativá-lo.Construtor aleatório, Python 3
Este é um exemplo estúpido de um bot que nunca destrói nada e tenta ativar um vértice aleatório a cada turno. Observe que não é necessário verificar se o vértice está inativo; o controlador cuida disso.
Execute com o comando
Pode ser necessário substituí-lo
python3
,python
dependendo da instalação do Python. Para fazer isso, basta editar obots.txt
arquivo. Atualizei o controlador e não há mais necessidade de mexer nos caminhos dos arquivos.fonte
sys.stdout.flush()
você pode apenas fazerflush=True
um argumento paraprint
.Explorer, Python 3
Estratégia de ativação:
Cria um mapa de calor com base no estado de cada nó (ativo / inativo / interrompido) e escolhe o nó que teria o maior valor esperado de mapa de calor por pessoa, se ele escolhesse esse.
Estratégia de destruição:
Nunca destrói nada, pois isso não ajuda muito o bot.
fonte
Aborrecimento, Bash
Tentou fazer o resultado parecer mais interessante.
Corra com
bash annoyance.sh
.fonte
Middle Man
Eu vi alguns bots construídos a partir do topo e outros a partir do fundo. Este é o primeiro (eu acho) a começar no meio e trabalhar para cima e para baixo.
(não foi testado com o controlador, por isso, se a dose não funcionar, entre em contato.)
fonte