¡Dar una buena acogida! Estoy emocionado de presentar el 3er desafío de CodeBots. Este ha pasado mucho tiempo en la fabricación. Este desafío se dividirá en 3 secciones: la versión corta, la versión larga y detalles adicionales.
La versión corta
Cada competidor escribirá un programa de 24 comandos. Estos bots se moverán alrededor del mundo y copiarán su código en otros bots, mientras tratan de evitar que otros bots hagan lo mismo. Uno de los comandos posibles es el no-op Flag
. Si un bot tiene más de tu Flag
que cualquier otro bot Flag
, obtienes un punto. Ganas al tener la mayor cantidad de puntos.
Todo lo anterior fue cierto para los últimos dos desafíos. Esta vez, los bots podrán ejecutar múltiples líneas de código al mismo tiempo.
La versión larga
La API
Cada bot tendrá exactamente 24 líneas, donde cada línea tiene el siguiente formato:
$label command parameters //comments
Las etiquetas y los comentarios son opcionales, y cada comando tiene un número diferente de parámetros. Todo distingue entre mayúsculas y minúsculas.
Parámetros
Los parámetros están escritos y pueden estar en los siguientes formatos:
- Un valor de 0 a 23.
- Una variable:
A
,B
,C
,D
- Un valor usando la suma:
A+3
o2+C
- Una línea de código, que se designa con el
#
signo (#4
representaría la quinta línea, mientras#C+2
que representaría la línea calculada porC+2
). - Puede usar una en
$label
lugar de designar una línea de código. - La variable o línea de código de su oponente, designada por
*
. Tu oponente es el bot en la casilla que estás enfrentando. (*B
representa elB
valor de tu oponente , mientras que*#9
representa la décima línea de tu oponente). Si no hay nadie en ese cuadrado, el comando no se ejecuta.
Comandos
Mover V
Mueve el bot North+(V*90 degrees clockwise)
. El movimiento no cambia de dirección.
Vuelta V
Gira el bot en V*90 degrees
sentido horario.
Copia VW
Copia lo que sea que esté V
adentro W
. Si V
es un número de línea, W
debe ser un número de línea. Si V
es una variable o un valor, W
debe ser una variable.
Bandera
No hace nada.
Estrella de la TV
Inicia un nuevo hilo adjunto a la variable V
. Inmediatamente, y en cada turno futuro, el hilo ejecutará el comando en línea V
.
Si V
ya está conectado a un hilo, entonces este comando es no operativo. Si V
es la variable de un oponente, entonces el oponente comenzará un hilo adjunto a esa variable.
Parada V
Detiene el hilo adjunto a la variable V
al final de este turno.
Bloqueo V
Evite que la línea o variable V
se use de cualquier manera, excepto por el hilo que llamó Lock
. Una llamada posterior a Lock
por el mismo hilo se desbloquea V
. No se pueden invocar bloqueos en las variables o líneas del oponente.
If Cond VW
Esto lo probará Cond
. Si la condición es verdadera, moverá el puntero del hilo al número de línea V
, de lo contrario al número de línea W
. Esa línea se ejecutará inmediatamente.
Condicionales pueden ser X=Y
, X<Y
, !X
o ?X
:
X=Y
prueba si dos líneas son del mismo tipo y del mismo bot, o prueba si dos valores equivalen a la misma cantidad.X<Y
prueba si el valor deX
es menor queY
.!X
prueba si la variable o la líneaX
está bloqueada (devuelve verdadero si está bloqueado)?X
prueba si una variable dada tiene un hilo adjunto
Detalles adicionales
Interacciones multihilo
Las acciones del mismo tipo se ejecutan al mismo tiempo. Las acciones se ejecutan en el siguiente orden:
Bloquear. Si varios hilos intentan bloquear una variable, todos fallarán. Si un subproceso está desbloqueando una variable mientras otro intenta bloquearlo, la variable permanecerá desbloqueada.
Comienzo. Si varios hilos intentan iniciar un hilo en una variable, contará como un solo inicio.
Copiar. Si dos hilos se copian en la misma variable, la variable terminará como un valor aleatorio. Si ambos copian en la misma línea, ninguno funcionará. Si un hilo se copia a la misma variable desde la que se está copiando otro hilo, el último hilo copiará un valor aleatorio. Si dos hilos se copian de la misma variable, ambos funcionarán bien.
Si. Todos los condicionales se probarán simultáneamente, y luego las variables del hilo se actualizarán después. La ejecución de un
If
puede provocar que se agregue una acción con mayor prioridad. Las acciones con mayor prioridad se ejecutarán antes de pasar al pasadoIf
, mientras que las acciones con menor prioridad se ejecutarán después delIf
.Moverse. Múltiples movimientos en el mismo bot moverán al bot la suma de todos los movimientos. Si varios bots terminarían en el mismo lugar, volverán a su punto de partida.
Giro. Sumas múltiples en el mismo bot sumarán.
Detener. Múltiples comandos de parada en la misma variable contarán como una sola parada.
Otros detalles
Su hilo inicial comienza adjunto a la D
variable
Recurrir con un If
(que tiene una If
declaración apuntando a sí mismo) hará que su bot no haga nada
Si se detiene un hilo después del bloqueo, esos bloqueos se desbloquearán
Las acciones para usar una variable o línea bloqueada no harán nada.
Si un bot tiene menos de 24 líneas, las líneas restantes se llenarán con Flag
Al realizar una escritura en una variable que también se adjunta a un subproceso inicial, el subproceso comenzará su ejecución en el nuevo valor a medida que el subproceso comience el siguiente turno.
Los bots se colocan en un mundo toroidal con el siguiente patrón:
B...B...B...
..B...B...B.
B...B...B...
He agregado varios bots de muestra que se comentan como referencia de idioma.
El controlador se encuentra aquí . He trabajado mucho tiempo en ello, pero probablemente todavía tiene errores. Cuando la especificación y el controlador se contradicen, la especificación es correcta.
Marcador
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
fuente
Respuestas:
Escáner bloqueado Bot
Escanea al enemigo lo más rápido posible y reemplaza las líneas con banderas.
fuente
DoubleTapBot
Este bot tiene 3 hilos: uno para mover (A), los otros dos para marcar (B y D). B bandera 1/2 vuelta, D bandera 1/3 vuelta. Entonces, un turno, él hará doble bandera al oponente :).
Supongo que C volverá a 0 si excede 23.
Debería ser bastante seguro si tiene algún turno para prepararse (8 turnos), ya que siempre mantendrá al menos 2 hilos (A y B) funcionando normalmente.
No puedo probarlo en este momento, así que haré la prueba cuando regrese a casa :)
fuente
Doble golpe estacionario bloqueado
Inspirado en DoubleTapBot de @Katenkyo, este deja un par de banderas y cualquier esperanza de movimiento a cambio de bloquear completamente sus propios hilos para que nunca se pueda reprogramar. Sin embargo, todavía es susceptible de tener banderas enemigas escritas en áreas de código sin bucle.
fuente
Mover al azar
Se mueve en dirección psuedorandom
fuente
De cáscara gruesa
Bloquea sus cosas tanto como puede
fuente
Atacante bot
Copia banderas en varios lugares
fuente
Hilo triple
Este simple bot ejecuta tres hilos, todos con el mismo código. Cada hilo ataca 1/3 de turno, se mueve 1/6, gira 1/6 y hace la contabilidad 1/3.
fuente
Banana Bot
Intenta tirar plátanos en la rueda del enemigo antes de que el enemigo pueda hacer algo. Propenso a ser aplastado.
fuente
Cortador de hilo Bot
Detenga todos los hilos enemigos antes de llenar con su código.
fuente
Copiar y auto-marcar
Este bot ejecuta tres hilos. El hilo D se mueve hasta que se topa con un enemigo, luego intenta copiar una bandera en ellos, luego se mueve en una dirección aleatoria. El hilo A copia su propia bandera sobre líneas no esenciales del código del bot. El hilo B es solo un contador. La variable, la bandera y las líneas de código utilizadas por cada subproceso están completamente bloqueadas en los primeros 15 turnos, y el bot sobrescribe casi todo su código de inicio con sus propias banderas. No creo que sea posible convertir este bot en el banner de otro equipo después del turno 15 sin que un bot de ataque dedicado no haga nada más que escribir banderas en él.
fuente
Move 0
es moverse hacia el norte, no hacia adelante.