sheesh, este é realmente o quarto? Para todos os veteranos, o principal desafio é o mesmo, mas estamos usando Java em vez de uma linguagem personalizada. Aqui estão os três últimos desafios do CodeBot , caso você esteja interessado.
O objetivo do CodeBots é tornar seu bot o mais viral possível . Cada bot carrega uma bandeira e você precisa garantir que sua bandeira esteja em todo lugar .
API
Os bots seguirão um "protocolo" padronizado e os bots progredirão pelas seguintes etapas de forma síncrona:
IPAddress selectMessageRecipient()
permite que um bot escolha para quem ele deseja enviar uma mensagem "amigável".Message sendMessage()
permite que um bot escolha o conteúdo da mensagem que ele enviará.processMessage(IPAddress, Message)
é chamado para cada mensagem que um bot recebe.FunctionType selectFunctionToBlock()
impede que uma função seja substituída na curva atual. Veja o passo 7.IPAddress selectAttackTarget()
permite que um bot escolha quem ele quer DDOS. Um ataque DDOS será bem-sucedido se o bot for direcionado por 3 bots ao mesmo tempo. Se um ataque for bem-sucedido, cada um dos invasores poderá executar as etapas 6 e 7.readData(ReadonlyBot)
permite que um bot leia os dados armazenados no bot vulnerável.FunctionType selectFunctionToReplace()
é o cerne desse desafio . Você tem permissão para selecionar 1 função (das 8 listadas aqui) para copiar do seu bot para o bot dele. Então, sua função será chamada em vez da deles . Se vários bots selecionam a mesma função, uma aleatória será bem-sucedida.String getFlag()
é chamado no final do jogo e deve retornar uma sequência única para o seu envio. Sua função sempre deve retornar a mesma string. A finalização com o maior número de bandeiras no final do jogo vence.
Armazenamento
Você tem três formas de armazenamento, um Catálogo de endereços , um Registro e Variáveis . Essas formas de armazenamento são locais para o bot em que sua função está sendo executada (portanto, se sua função for copiada, o conteúdo de cada um desses objetos será diferente). Todos esses objetos podem ser modificados ou limpos manualmente. Para obter esses objetos, você tem um getter em sua classe (por exemplo getLog()
).
O AddressBook armazena uma lista de IPAddress , cada um com um AddressType , que permite classificar os diferentes tipos de endereços. O Catálogo de Endereços sempre conterá pelo menos 1 endereço (se estiver limpo, será adicionado um aleatório). A limpeza do seu AddressBook para obter vários endereços IP não é permitida.
O Log armazena uma lista de todas as ações executadas, bem como dados sobre a ação. Também inclui um histórico de todos os ataques bem-sucedidos (embora você não saiba quais funções eles substituem)
O objeto Variables permite armazenar variáveis de string anexadas a um nome de string. No início do jogo, Variáveis conterão uma única variável, ID
que contém um ID gerado aleatoriamente, exclusivo para o seu tipo de bot.
Você também tem outras funções de acesso:
int getTurnNumber()
retorna um número inteiro com a curva atualbool functionsMatch(ReadonlyBot, FunctionType)
testes para ver se a função do ReadonlyBot corresponde à suaIPAddress personalAddress()
retorna seu endereço IP
Como implementar
- Você pode obter o código no Github
- Adicione seu bot à
\bots
pasta e, em seguida, adicione uma referência ao seu bot emcontroller\CodeBotFactory.java
- Seu bot deve estender
codebots.bot.CodeBot
oucodebots.bots.DefaultCodeBot
- Você precisa do Java 8 se quiser executar o controlador.
- Você pode executar o código (supondo que você esteja na
/src
pasta) usandojavac codebots\*.java
para compilar e depoisjava codebots.Main
executar. - Você pode não ter quaisquer variáveis de membro não-constantes em sua classe
- Reflexão não é permitida.
- Formas de comunicação entre bots (do mesmo tipo ou de tipos diferentes) fora dos métodos listados acima não são permitidas.
- Bots mudos e / ou suicidas são permitidos, mas todos os bots devem ser funcionalmente diferentes das entradas existentes.
- Se você quiser aleatoriedade no seu bot, use
getRandom()
- Por favor, tente manter seu código eficiente. Passei muito tempo analisando e tornando o controlador rápido.
Pontuações
105.2501 Expelliarmus!
104.5803 Estou ajudando!
104.2746 Quem sou eu?
103.8529 Dumb Bot
103.2028 Substituto
102.7045 Caos
102.4046 Hermit Bot
102.2849 Swarmer
100.5598 O bot aleatório ama você
99.966 Confie na confiança!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 Apenas seu e-mail de vizinhança amigável que fornece robô.
89,4645 null
fonte
Respostas:
TrustBot
Se você enviar uma mensagem para ele, ele fará o que diz. Se ele ler um bot, ele copiará os endereços diretamente em seu livro. Ele ataca os bots que o catálogo de endereços diz para atacar.
fonte
AmnesiaBot
Um bot aleatório que injeta outros bots com código de perda de memória. Cada função começa com o código para limpar o log, o Catálogo de endereços e as variáveis. Este código fará com que os bots inteligentes percam memória, na tentativa de acabar com a lógica.
fonte
NullBot
A bandeira dele é muito ... característica ...
Isso também serve para testar o controlador e os limites da regra "são permitidos bots burros".
fonte
null
é uma string. ;) Apenas uma string sofisticada.RandomCodeBot
Entrada aleatória obrigatória no KoTH
fonte
DisarmerBot
O DisarmerBot não é muito inteligente. Se receber instruções de ataque, escolherá um atacante aleatório, caso contrário, atacará um jogador aleatório. Ele simplesmente substitui a
selectFunctionToBlock
função deles de bloquearselectFunctionToBlock
.fonte
MarkedBot
Marca-se na primeira rodada e usa essas informações nas rodadas posteriores. Dessa forma, se outro bot for injetado com seu código de ataque, ele será ineficaz.
fonte
SwarmBot
Esse bot não bem conhecido é bastante complicado (e o mais complicado enviado até agora), mas tentei um bot que substituísse sistematicamente todos os métodos de um destino antes de passar para um novo destino. Ele tenta identificar cópias de si mesmo e tratá-las como aliadas, verificando-as periodicamente para garantir a integridade. Eu não inventei um nome melhor.
Vinculando ao ramo de repositório do github, pois esse bot tem 340 linhas.
https://github.com/Draco18s/CodeBots4/blob/master/src/codebots/bots/SwarmBot.java
Alguns pontos interessantes:
Variables
ativado e incrementa a cada rodada. Isso deve seguir a regra "sem variáveis não constantes".functionsMatch
método adicionado . SemfunctionsMatch
era impossível escrever um bot que pudesse tomar decisões significativas, pois era cego. Ele poderia ler as variáveis e logs dos alvos, mas não sabe nada sobre o estado do alvo.Provavelmente ainda existem algumas melhorias possíveis, mas não as vejo. As linhas 198-205 provavelmente são um problema de desempenho, mas até que a classe IPAddress permita que os endereços sejam reconstituídos e armazenados em Variáveis, isso é necessário (como os bots não têm como validar um endereço, qualquer armazenamento de um endereço inválido faz com que o jogo agrupar um destino nulo em um ReadOnlyBot, lançando o NPE).
Editar: Atualizações 12/12/15
Ajustar alguns dos parâmetros na
getTurnNumber()
lógica permitiu alguns aumentos no desempenho. O aumento de 5% para 10% na segmentação no final do jogo valeu cerca de 15 pontos, aumentando igualmente a segmentação no início do jogo de 5% para 8%. Agora, esse bot combinado pode (quase) sobreviver mesmo quando confrontado com o AmnesiaaBot (alcançando o segundo lugar com uma pontuação de 110, onde o HelperBot chega a 117).Mesmo com esses ajustes, pode ter azar, então, por 10 rodadas, seu alcance é de aproximadamente 170-185.
fonte
new IPAddress
ligação deveria ter sido uma "consulta do catálogo de endereços", como eu havia feitoreadData
. Eu extraí essa pesquisa e fixei a linha 143.DefaultCodeBot
Tenta fazer coisas razoáveis. (Substitua essa classe se você não quiser implementar todas as funções)
fonte
HelperBot
O bot auxiliar não faz nada além de tentar espalhar sua própria bandeira ... ou pelo menos a bandeira que está carregando no momento ...
Se o HelperBot pressupuser que qualquer método próprio que seja sobrescrito (exceto
getFlag()
) será substituído por algo melhor.fonte
Caos
Ele liberta todas as bandeiras da tirania de ser bloqueado.
fonte
Substituto
Esta entrada substitui todas as
selectFunctionToReplace
funções por sua própriaselectFunctionToReplace
função.fonte
MailBot
O Mailbot apenas lida com mensagens. Não é bem-sucedido em colocar sua própria bandeira no mundo (pontuação média ~ 50, ligeiramente superior a nullbot em ~ 45), mas envie uma mensagem e encaminhará seu endereço para outra pessoa.
Eu considerei salvar detalhes para encaminhar toda a mensagem para um novo bot (conteúdo e sinalizador) em vez de apenas o IP do remetente, mas isso envolveria o uso intenso de variáveis sem nenhum ganho funcional, principalmente considerando o AmnesiaBot em jogo.
fonte
DumbBot
Ugh, isso parece sujo. Esta é provavelmente a única coisa que vence o AmnesiaBot. Na realidade, é apenas um RandomBot especializado: ele obtém um bot aleatório na simulação (via
getAddressBook().clear()
) e substitui aleatoriamente a função Block ou a função Flag. É isso aí. Ao escolher apenas esses dois, sua taxa de propagação da bandeira é maior que o AmnesiaBot ou o HelperBot, mas apenas um pouco após as 3000 rodadas:Eu brinquei um pouco com a função de substituição, mas no final, esta é a versão que teve mais sucesso.
fonte
Hermit Bot
Ele mora sozinho e fala apenas consigo mesmo. Se menos pessoas souberem quem ele é, ele se incomodará menos. Se alguém o incomodar, ele os atacará até que alguém o incomode.
fonte