Code Bots
Eu odeio variáveis privadas e protegidas. Eu só quero acessar tudo e qualquer coisa!
Se você é como eu, então este desafio é para você!
Escreva um bot que funcione em harmonia com outros bots e faça com que outros façam o que quiser. Você é um programador e sabe como as coisas devem funcionar. Seu trabalho é converter o maior número possível de bots para os seus caminhos.
O código
Você terá 24 linhas de código para escrever seu bot. A cada turno, cada bot executará 1 linha sequencialmente.
Cada bot armazena 5 variáveis A
através E
. A
e B
são para uso pessoal, C
armazena a próxima linha a ser executada, D
armazena a direção atual e E
é um número aleatório. As variáveis começam em 0, exceto D
, que começará com um valor aleatório. Todas as variáveis têm apenas o armazenamento de 0 a 23. Números maiores ou menores serão modulados por 24.
Neste post, usarei o oponente para ser o bot adjacente que você está enfrentando
Cada linha deve conter um dos 5 comandos a seguir:
Flag
faz nada. Exceto que é como você ganhaMove
move seu bot naD
direção th. Se um bot já ocupa o espaço, nenhum movimento aconteceráCopy Var1 Var2
copia o conteúdo de Var1 para Var2If Condition Line1 Line2
Se Condição for verdadeira, executa Linha1, caso contrário Linha2Block Var1
bloqueia a próxima gravação em uma variável
Uma variável pode ser usada da seguinte maneira:
#Var
usará a variável como um número de linha. Se A
for 17, Copy #8 #A
copiará o conteúdo da linha 8 para a linha 17.
*Var
usará a variável do seu oponente. Copy 5 *C
irá definir a C
variável do oponente para 5
Var+Var
adicionar as duas variáveis. Copy D+1 D
girará o bot para a direita
Quando D
é usado como uma direção, [North, East, South, West][D%4]
será usado
Esses modificadores podem ser encadeados: Copy *#*C #9
copiará a próxima linha que seu oponente executará em seu próprio código na linha 9. **D
refere-se à D
variável do oponente de seu oponente .
Uma condição será avaliada da seguinte forma:
- Se
Var
:- Se Var é
A
atravésC
, ele irá retornar true se Var é diferente de zero, o mais falso. - Se Var for
D
, ele retornará true se houver um bot naD
direção th, caso contrário false - Se Var for
E
, retornará true se E for ímpar, caso contrário false - Se Var for uma linha, retornará true se for uma linha Flag.
- Se Var é
- Se
Var1=Var2
:- Retorna verdadeiro se ambos são
A-E
e é igual ao mesmo número - Retorna true se ambas são linhas e o tipo de linha é igual
- Retorna verdadeiro se ambos são
- Se
Var1==Var2
:- Retorna verdadeiro se ambos são
A-E
e é igual ao mesmo número - Retorna true se ambas são linhas e são idênticas (sinalizadores de bots diferentes não serão iguais)
- Retorna verdadeiro se ambos são
50 bots de cada tipo serão colocados em um mundo toroidal no seguinte padrão:
B...B...B...B...
..B...B...B...B.
B...B...B...B...
..B...B...B...B.
Após cada jogo de 5.000 turnos, as bandeiras de cada bot serão contadas. Você ganha um ponto se um bot tem mais sua bandeira do que qualquer outro tipo de bandeira. Se houver empate entre os N
bots, nenhum ponto será dado.
Serão 10 jogos e as pontuações serão acumuladas no final.
Notas laterais
Comentários de fim de linha são permitidos e são indicados com //
Tentar fazer algo que não faz sentido, como adicionar a uma linha, não fará nada
Tentar fazer algo em um bot inexistente não fará nada
A recursão infinita em um If
terminará sem que nenhuma linha seja executada
If
não altera o valor de C
A Block
não expira até que alguém tente escrever nele
Várias variáveis e linhas podem ser bloqueadas ao mesmo tempo
Block
A execução de uma variável várias vezes bloqueará várias vezes, desde que a segunda instrução de bloco esteja em uma linha de código diferente da sua primeira
Espaços são permitidos apenas entre argumentos (e após o comando)
Se um bot for menor que 24 linhas, Flag será o restante das linhas.
Programa de amostra
Copy 2 C //Skip to the If line
Flag //Where I'm storing my flag
Move //Move in the D'th direction
If D #5 #2 //If there's a bot, copy code, otherwise, move!
Copy #1 *#E //Copy my flag onto a random spot in my bot's code
Copy 2 C //Skip back to the If line
O programa será executado pelo meu controlador Python aqui .
O controlador Java está aqui É rápido e parece muito melhor que o python.
Placar:
- 6837 $ Copiar
- 3355 Lockheed
- 1695 MindControl
- 967 Bizantino
- 959 AttackOrElse
- 743 Cadmyllion
- 367 Gripe
- 251 TheCommonCold
- 226 Magus
- 137 HideBlockAttack
- 129 RowBot
- 123 FastMoveCloneDodge
- 112 FastForwardClone
- 96 QuickFreeze
- 71 RepairAndProtect
- 96 SuperFreeze
- 93 RovingVirus
- 80 ForwardClone
- 77 FreezeTag
- 68 Palimpseste
- 62 BlockFreezeAttack
- 51 RushAttackDodge
- 46 Bloqueador
- 40 TurretMaker
- 37 Copycat
- 37 Kamikaze
- 35 FlagInjector
- 33 RandomCopier
- 31 insidioso
- 29 HappyAsAClam
- 25 NanoVirus
- 21 Nullifier
- 19 Nanoviris
- 17 BoringCopybot
- 16 Movebot
- 14 Flagbot
- 13 Neutralizador
- 12 Câncer
- 9 DNAbot
- 9 Parasita
- 8 MetaInsidious
- 8 Rebranding
- 8 AdaptiveBot
- 8 ReproduzindoBot
- 8 KungFuBot
- 5 QuickFreezerbot
- 4 Atacante
fonte
Respostas:
Flagbot
Por que se preocupar em fazer alguma coisa quando outros bots serão bons o suficiente para me fornecer seu código?
fonte
Congelar tag
Prenda o oponente em um loop, encha-o de bandeiras e passe para o próximo oponente.
fonte
Copy C+23 C
Essa deve ser a linha de código mais maliciosa xD.Or would that not count as your flags?
. Porque se eles não contam como suas próprias bandeiras, definitivamente não é uma boa soluçãoParasita
Por que matar outros bots? Este bot examina o código do oponente e substitui apenas as bandeiras.
fonte
$ Copiar
Esse bot usa muitas das mesmas técnicas que a Lockheed da COTO, então eu emprestarei e aprimorarei descaradamente.
Isso explora uma
C
vulnerabilidade para quebrar blocos e até reverte o neutralizador. Também está escrito em absolutos por causa disso. Acho que isso pode ser interrompido se aC
mudança for restabelecida, mas, enquanto a mudança for constante, ela poderá ser reescrita para combatê-la.Por qualquer motivo, a falta de loop no final tornou esse bot super bom.
fonte
C
valores. Assim, um bloco pode ser empilhado quando chamado de umaIf
instrução, que é a exploração que está sendo usada aqui. $ Copy quebra blocos (como o molusco) executandoCopy
na mesma linha repetidamente até obter êxito, o que lhe dá uma vantagem sobre a Lockheed.Lockheed
Minha terceira (e provavelmente final) submissão a essa guerra bot em particular: o Lockheed Reactor, ou "Lockheed", para abreviar.
Agradecimentos especiais a @Wasmoo, que compartilhou sua descoberta do "'Bloquear uma variável várias vezes bloqueará várias vezes, desde que a segunda declaração de bloco esteja em uma linha de código diferente da sua primeira.' simplesmente não é verdade "exploração. Faço uso extensivo disso.
Agradecemos também a Nathan Merill por administrar a competição e por publicar o simulador. O simulador é totalmente inestimável no ajuste de bots. Eu não teria acreditado se não tivesse simulado com meus próprios olhos, mas a adição ou remoção do recurso bot mais conceitualmente menor pode significar a diferença entre grande sucesso e falha abjeta. Estou dividido quanto a isso ser bom ou não.
fonte
If
apontador para essa linha não falhará), você está bloqueando o mesmo valor (uma única linha pode bloquear as linhas de 1 a 24 com uma variável incremental) e o bloco ainda não foi lançado (alguém tentou modificar essa variável)C
,<block target>
) ainda não estiver em vigor". Ou seja, a linha na qual a instrução do bloco está não tem relevância para o empilhamento, exceto que, se o bloco for executado diretamente,C
= endereço da instrução do bloco.Ataque ou outro
Vendo que robôs defensivos como o bizantino estavam indo tão bem, decidi fazer um robô defensivo também.
Isso tem dois conjuntos de padrões, dependendo da presença ou não do inimigo.
ele alterna entre copiar sua bandeira e código de cópia que fará com que o inimigo copie essa bandeira (um replicador fraco)que copia sua bandeiraMais testes mostraram alguns conceitos importantes:
A+7
mostrado é mais eficaz do que qualquer outro incremento (+200 no próximo melhor)Observar a simulação graficamente através da interface do usuário Java ajudou muito. Obrigado! Abaixo está o código novo e aprimorado. Acho que não posso fazer mais nada.
fonte
C
que o bloqueou. Como este bot possui um bloco rotativo baseado emC
, ele acumulará vários blocos em cada um de seus comandos. Isso torna esse bot ainda mais defensivo.If
linha a uma lista, digitando aC
variável que o chamou. Assim, com os 1 bloco e os 9 Ifs que executam a instrução Block, o bot pode obter até 10 blocos para cada linha (fazendo pelo menos 24 * 10 * 10 turnos). Talvez o OP não tenha transmitido a simulação corretamente.Row Bot
Vai se mover até encontrar um robô.
Irá definir esse robô na mesma direção que ele.
Em seguida, copiará seu código no robô.
Isso deve criar uma linha de robôs "Row Bot". :)
fonte
If
declarações devem ser capitalizadas. Segundo, não deve haver espaços em nenhum dos lados do=
, comoD=*D
.Super Freeze
Esse bot continua tentando congelá-lo na frente dele até que funcione, depois escreve um monte de bandeiras em linhas aleatórias e, após 8 turnos, ele gira e passa para outro oponente.
fonte
bizantino
Um bot altamente defensivo que institui vários blocos em suas bandeiras e instruções mais sensíveis, incluindo meta-blocos (isto é, blocos em instruções críticas de bloco).
Ele também se move constantemente de maneiras imprevisíveis e planta bandeiras em vários locais dos oponentes, com base no melhor esforço.
Não tenho certeza de como será o desempenho, pois não posso simular. Mas vamos tentar. ;)
aviso Legal
Escrevi isso antes de ser gentilmente informado pelo PhiNotPi que a lógica condicional é gratuita. No entanto, decidi deixá-lo, pois nunca se pode ter muitos bots.
fonte
Cadmyllion
"Acabei de entrar em um bot no battle royale", eu digo. "Ele se move a cada poucas voltas para evitar ataques de bots mais lentos."
"O que você quer dizer com bots mais lentos?" PhiNotPi pergunta.
"Bots presos avaliando longas cadeias de lógica condicional", respondo.
"As instruções 'If' que redirecionam para outras instruções - incluindo outras instruções 'if' - são todas executadas no mesmo turno" ", diz PhiNotPi.
"Doces regras massacradas de código de montagem!" Eu choro. "Quem teve essa ideia?"
... e assim é a história de como o Cadmyllion surgiu.
Cadmyllion: o bot que explora alegremente a capacidade surreal de avaliar infinitamente muitas expressões condicionais em uma única instrução ... tornando praticamente tudo o que faz condicional.
Código
fonte
Meta Insidious
Esse bot congela e depois converte os oponentes em versões menos eficientes do Sparr's Insidious , que por sua vez transformam os oponentes em bots que sinalizam spam para mim. Este é provavelmente o bot mais complexo que eu escrevi e, portanto, espero que seja terrível, não havia espaço para bloquear e apenas um sinalizador cabia no código. Transformar um bot em um clone insidioso também leva muito tempo.
O maior desafio foi escrever o código para os clones insidiosos de tal maneira que funcionasse independentemente da sua posição no bot. O congelamento é removido quando colo o penúltimo código exatamente onde o congelamento está localizado, isso inicia o oponente bem a tempo.
fonte
Reparar e proteger
Este bot repara seu próprio código, enquanto protege as linhas recém-reparadas.
Explicação:
O valor inicial de
A
é0
e as linhas são numeradas de 0 a 23. Se aIf
instrução é executada e é falsa, ela tenta executar a mesma linha novamente. O controlador não permite que um bot execute a mesma linha duas vezes, então o turno termina eC
é incrementado para1
.A próxima linha
Copy #A #A+8
é realmente executada independentemente do valor daIf
instrução. A diferença é que ele é executado duas vezes se verdadeiro e uma vez se falso. Se a linha#A+8
estiver bloqueada (o que acontece eventualmente), executá-la duas vezes com a cópia real, enquanto executá-la uma vez, apenas a desbloqueará. Em seguida, a linha recém-copiada é bloqueada para preservá-la.fonte
A
? Não é0
? Nesse caso, sua primeira linha compara a linha 0 à linha 16, mas como eu entendi no bot de exemplo do OP, a primeira linha é a linha 1, não é? Além disso, ainda na sua primeira linha,#C
refere-se a essa mesma linha, o que significa que, se aIf
instrução retornar false, você ficará preso em um loop infinito?Neutralizador
Esse bot faz com que a vítima reescreva todo o programa, valendo 0 pontos. Quando o vírus está no lugar, ele segue em frente. Esta é uma abordagem de terra arrasada para a vitória.
A comparação
*#*C==#7
não parece se ajustar corretamente ao turno do oponente, mas o bot acaba seguindo em frente.fonte
Copy C+1 C
é tudo o que é necessário para pular uma única linha.Copy 23 C
vez disso, você pode querer voltar para a primeira linha.Insidioso
Inspirado pelo @Cruncher, este bot infecta outros bots com um pequeno bloco de código, preenchendo o outro bot com as bandeiras dele. Esses bots estão então patos para mais ataques, mas estarão cheios das minhas bandeiras quando forem infectados novamente por outra pessoa.
Edit: graças a @PhiNotPi pela assistência no golfe, @overactor por conselhos sobre eficiência
fonte
Feliz como um molusco
Este é um exercício de bloqueio. Ele teve um desempenho notavelmente bom até
$Copy
aparecer.O molusco possui 22 comandos de bloco. Como
A
é alternado a cada loop, eles fazem referência a linhas diferentes a cada vez no loop. Isso permite que cada comando empilhe blocos em todas as outras linhas, atingindo no máximo 22 blocos por linha. Assim, para quebrar o molusco totalmente blindado, seria necessário escrever uma linha 22 vezes.Por exemplo,
#10
será protegido sempre pelo loop pelas seguintes linhas:#10
protegido pela linha 7 (7+0+3
= 10)#10
protegido pela linha 0 (0+7+3
= 10)#10
protegido pela linha 17 (17+14+3
= 34 = 10)#10
protegido pela linha 10 (10+21+3
= 34 = 10)Então, após a Linha 10 do Loop 3,
#10
foi bloqueada 4 vezes, exigindo 4 gravações#10
para quebrar os blocos, com uma quinta para realmente substituir a linha.Observe que os blocos são codificados por seu
C
valor e não serão empilhados se a linha protegida já estiver bloqueada pelo mesmoC
valor. Portanto, após 22 blocos serem estabelecidos para cada linha, os blocos não serão mais empilhados.fonte
Controle mental
Eu acho que nunca é tarde demais?
O MindControl vem da minha ideia de que levaria um tempo considerável para copiar todo o meu programa para o oponente, durante o qual meu bot está vulnerável a ataques de outras direções. Então, por que não fazer o oponente copiar meu programa enquanto eu procuro por inimigos?
Quando encontra um inimigo, o MindControl congela imediatamente o inimigo para impedir a fuga. Em seguida, ele carrega o downloader para o oponente e deixa a vítima fazer o download do programa do MindControl. O downloader explora o fato de que poucos bots usam
B
e fazem loop até baixar todas as 24 linhas. Quando o downloader reescreve#19
deCopy 16 C
paraCopy 23 C
, significa que a vítima baixou todas as linhas e continuará se reinicializando.As primeiras versões do meu bot não incluem blocos. E era tão vulnerável que quase qualquer mudança é incapacitante. Então, decidi adicionar blocos com base no $ Copy do Wasmoo (que é baseado no Lockheed do COTO). A desvantagem que descobri é que é difícil para o original corrigir erros nas cópias. Mas isso está longe de prejudicar e a pontuação aumentou significativamente, por isso mantive os Blocks.
ATUALIZAÇÕES
Aprimorei o downloader para continuar tentando fazer o download até uma reescrita bem-sucedida para contornar os blocos. Isso significa que leva mais uma vez para carregar o downloader, mas minha pontuação dobrou após essa alteração! Não posso discutir com números.
Outra atualização. Como você deve ter notado, o MindControl decide se deve atacar o alvo comparando uma linha aleatória entre ele e o alvo. Se eles corresponderem, o MindControl apenas assume que o alvo já está infectado e o deixa em paz. (Nota: eu costumava usar uma linha estática para comparação, mas isso gera muitos falsos positivos e negativos). Acontece que isso fornece muitos falsos negativos. Então eu decidi explorar
==
e fazer algumas mudanças triviais comoC+23
a23+C
. O programa é funcionalmente idêntico, mas diferente aos olhos de==
. Agora que o MindControl não possui uma linha idêntica a qualquer linha em qualquer outro bot, ele atingirá 100% qualquer bot intocado. Mais uma vez, a pontuação aumentou significativamente.Melhorado o Downloader novamente. Agora ele roda em um loop mais curto. (que parece ter uma grande correlação com minha pontuação)
Downloader aprimorado mais uma vez. Usa o código do bot original para fazer o upload mais rápido. Também foram adicionados 2 blocos aleatórios que parecem melhorar a pontuação
fonte
Atacante
fonte
Movebot
Como o Flagbot, mas mova-se enquanto aceita presentes de código para acompanhar todas as nossas bandeiras.
fonte
Reproduzindo bot
Esse bot tenta congelar seu oponente e, em seguida, copia todo o código nele antes de reiniciar o outro bot. Isso também deve funcionar (principalmente) se o oponente usar o bloqueio, embora isso torne tudo ainda mais lento do que já é.
fonte
Mago
Magus é uma tentativa simples de um vírus auto-propagador. Ele tenta se copiar nos programas de outros bots. (Editado para remover números negativos, corrigir condição, aparar linhas.)
fonte
for (int i = 1; i < 25; i++)
.. .DNAbot
Este bot repara seu próprio código enquanto se move e ataca.
fonte
Bloqueador
fonte
Imitador
fonte
Freezerbot rápido
Tenta copiar bandeiras na linha que será executada próximo ao oponente, se move se não houver inimigo para atacar.
fonte
Bloco, Congelar, Ataque
Bloqueia todas as 24 linhas e, em seguida, repete 24 vezes em movimento ou ataque, e repete. Um ataque envolve tentar congelar o oponente, copiar quatro bandeiras para locais aleatórios e depois virar.
fonte
Esconder, Bloquear, Atacar
Este bot é baseado no Block Freeze Attack. Alterei o posicionamento de algumas
If
instruções para torná-lo mais compacto, permitindo que eu plantasse mais sinalizadores. Também tenho que fugir no início de um jogo para ganhar algum tempo para bloquear.fonte
Vírus itinerante
Esse bot vagueia até encontrar um inimigo, congela-o, substitui todo o código pelo seu próprio, descongela-o e depois vagueia novamente.
fonte
O frio comum
Ele o infecta praticamente imediatamente e você o espalha. com base no Parasita do PhiNotPi , o resfriado comum verifica quase imediatamente se ele pode copiar sua bandeira sobre a sua. Bloqueia um valor aleatório, se não puder. Se move um pouco se não houver oponente.
fonte
Gripe
Isso é baseado no resfriado comum (que foi baseado no meu parasita) com uma velocidade ligeiramente aumentada.
fonte
Rebranding
Este bot tenta localizar aleatoriamente bandeiras nos robôs inimigos e substituí-las por bandeiras amigáveis, afastando-se após detectar o sucesso. Inspirado por Cancer bot.
fonte