Bem vindo de volta! Estou animado para apresentar o terceiro desafio do CodeBots. Este foi um longo tempo em construção. Esse desafio será dividido em 3 seções: a versão curta, a versão longa e detalhes adicionais.
A versão curta
Cada concorrente escreverá um programa de 24 comandos. Esses bots se moverão ao redor do mundo e copiarão seu código em outros bots, enquanto tentam impedir que outros bots façam o mesmo. Um dos comandos possíveis é o no-op Flag
. Se um bot tem mais do Flag
que qualquer outro bot Flag
, você ganha um ponto. Você ganha por ter mais pontos.
Tudo isso foi verdade nos dois últimos desafios. Desta vez, os bots poderão executar várias linhas de código ao mesmo tempo.
A versão longa
A API
Cada bot terá exatamente 24 linhas, onde cada linha está no seguinte formato:
$label command parameters //comments
Rótulos e comentários são opcionais e cada comando possui um número diferente de parâmetros. Tudo faz distinção entre maiúsculas e minúsculas.
Parâmetros
Os parâmetros são digitados e podem estar nos seguintes formatos:
- Um valor de 0 a 23.
- Uma variável de:
A
,B
,C
,D
- Um valor usando adição:
A+3
ou2+C
- Uma linha de código, que é designada usando o
#
sinal (#4
representaria a quinta linha, enquanto#C+2
representaria a linha calculada porC+2
). - Você pode usar um em
$label
vez de designar uma linha de código. - A variável ou linha de código do seu oponente, designada por
*
. Seu oponente é o bot no quadrado que você está enfrentando. (*B
representa oB
valor do seu oponente , enquanto*#9
representa a 10ª linha do seu oponente). Se não houver ninguém nesse quadrado, o comando não será executado.
Comandos
Move V
Move o bot North+(V*90 degrees clockwise)
. O movimento não muda de direção.
Turn V
Gira o bot V*90 degrees
no sentido horário.
Copiar VW
Copia o que estiver V
dentro W
. Se V
é um número de linha, W
deve ser um número de linha. Se V
é uma variável ou valor, W
deve ser uma variável.
Bandeira
Faz nada.
Iniciar V
Inicia um novo thread anexado à variável V
. Imediatamente e em cada turno futuro, o encadeamento executará o comando on-line V
.
Se V
já estiver anexado a um encadeamento, esse comando não será utilizado. Se V
for a variável de um oponente, o oponente iniciará um segmento anexado a essa variável.
Stop V
Interrompe o encadeamento anexado à variável V
no final deste turno.
Bloqueio V
Impedir que a linha ou variável V
seja usada de qualquer forma, exceto pelo encadeamento chamado Lock
. Uma chamada subsequente para Lock
pelo mesmo encadeamento é desbloqueada V
. Bloqueios não podem ser chamados nas variáveis ou linhas do oponente.
Se Cond VW
Isso testará Cond
. Se a condição for verdadeira, o ponteiro da linha será movido para o número da linha V
, caso contrário, para o número da linha W
. Essa linha será executada imediatamente.
Condicionais pode ser X=Y
, X<Y
, !X
, ou ?X
:
X=Y
testa se duas linhas são do mesmo tipo e do mesmo bot ou você testa se dois valores são iguais à mesma quantidade.X<Y
testa se o valor deX
é menor queY
.!X
testa se a variável ou linhaX
está bloqueada (retorna true se bloqueada)?X
testa se uma determinada variável tem um thread anexado a ela
detalhes adicionais
Interações multithread
Ações do mesmo tipo são executadas ao mesmo tempo. As ações são executadas na seguinte ordem:
Bloquear. Se vários threads tentarem bloquear uma variável, todos eles falharão. Se um encadeamento está desbloqueando uma variável enquanto outro está tentando bloqueá-la, a variável permanecerá desbloqueada.
Começar. Se vários encadeamentos tentarem iniciar um encadeamento em uma variável, ele contará como um único início.
Cópia de. Se dois threads copiam para a mesma variável, a variável termina como um valor aleatório. Se os dois copiarem para a mesma linha, nenhum deles funcionará. Se um encadeamento copiar para a mesma variável de que outro encadeamento estiver copiando, o último encadeamento copiará um valor aleatório. Se dois threads estiverem copiando da mesma variável, ambos funcionarão bem.
E se. Todos os condicionais serão testados simultaneamente e, em seguida, as variáveis de thread serão atualizadas posteriormente. A execução de um
If
pode fazer com que uma ação com maior prioridade seja adicionada. As ações com maior prioridade serão executadas antes de passar oIf
, enquanto as ações com menor prioridade serão executadas após oIf
.Mover. Vários movimentos no mesmo bot moverão o bot a soma de todos os movimentos. Se vários bots acabarem no mesmo local, eles serão retornados ao local inicial.
Virar. Várias rodadas no mesmo bot serão somadas.
Pare. Vários comandos de parada na mesma variável contam como uma única parada.
Outros detalhes
Seu encadeamento inicial começa anexado à D
variável
A repetição com um If
(tendo uma If
declaração apontada para si) fará com que o seu bot não faça nada
Se um encadeamento for interrompido após o bloqueio, esses bloqueios serão desbloqueados
Ações para usar uma variável ou linha bloqueada não farão nada.
Se um bot for menor que 24 linhas, as linhas restantes serão preenchidas com Flag
A execução de uma gravação em uma variável que também está anexada a um encadeamento inicial fará com que o encadeamento inicie sua execução no novo valor, à medida que o encadeamento inicia na próxima curva.
Os bots são colocados em um mundo toroidal no seguinte padrão:
B...B...B...
..B...B...B.
B...B...B...
Adicionei vários exemplos de bots comentados como referência de idioma.
O controlador está localizado aqui . Eu trabalhei muito tempo nisso, mas provavelmente ainda tem bugs. Quando a especificação e o controlador contradizem, a especificação está correta.
Placar
1. 771 LockedScannerBot
2. 297 CopyAndSelfFlag
3. 289 DoubleTapBot
4. 197 ThreadCutterBot
5. 191 TripleThread
6. 180 ThickShelled
7. 155 Attacker
8. 99 RandomMover
9. 90 BananaBot
10. 56 LockedStationaryDoubleTap