¡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