Code Bots
Odio las variables privadas y protegidas. ¡Solo quiero acceder a todo!
Si eres como yo, ¡este desafío es para ti!
Escribe un bot que funcione en armonía con otros bots para que otros hagan lo que quieras. Eres programador y sabes cómo se supone que funcionan las cosas. Su trabajo es convertir tantos bots a su manera como sea posible.
El código
Tendrás 24 líneas de código para escribir tu bot. Cada turno, cada bot ejecutará 1 línea secuencialmente.
Cada bot almacena 5 variables a A
través E
. A
y B
son para uso personal, C
almacena la siguiente línea para ejecutar, D
almacena la dirección actual y E
es un número aleatorio. Las variables comienzan en 0, excepto para D
, que comenzará en un valor aleatorio. Todas las variables solo tienen tienda 0-23. Los números mayores o menores serán modulados por 24.
En esta publicación, usaré al oponente como el bot adyacente al que te enfrentas
Cada línea debe contener uno de los siguientes 5 comandos:
Flag
no hace nada. Excepto que así es como ganasMove
mueve tu bot en laD
dirección th. Si un bot ya ocupa el espacio, no ocurrirá ningún movimientoCopy Var1 Var2
copia el contenido de Var1 en Var2If Condition Line1 Line2
Si la condición es verdadera, ejecuta Line1, de lo contrario Line2Block Var1
bloquea la próxima escritura en una variable
Una variable se puede usar de la siguiente manera:
#Var
usará la variable como un número de línea. Si A
es 17, Copy #8 #A
copiará el contenido de la línea 8 en la línea 17.
*Var
usará la variable de su oponente. Copy 5 *C
configurará la C
variable del oponente para 5
Var+Var
agregar las dos variables. Copy D+1 D
rotará el bot hacia la derecha
Cuando D
se usa como una dirección, [North, East, South, West][D%4]
se usará
Estos modificadores se pueden encadenar: Copy *#*C #9
copiará la siguiente línea que su oponente ejecutará en su propio código en la línea 9. se **D
refiere a la D
variable del oponente .
Una condición se evaluará de la siguiente manera:
- Si
Var
:- Si Var ha
A
terminadoC
, devolverá verdadero si Var es distinto de cero, de lo contrario falso. - Si Var es
D
, devolverá verdadero si hay un bot en laD
dirección th, de lo contrario falso - Si Var es
E
, devolverá verdadero si E es impar, de lo contrario falso - Si Var es una línea, devolverá verdadero si es una línea de bandera
- Si Var ha
- Si
Var1=Var2
:- Devuelve verdadero si ambos son
A-E
, e igual al mismo número - Devuelve verdadero si ambas son líneas y el tipo de línea es igual
- Devuelve verdadero si ambos son
- Si
Var1==Var2
:- Devuelve verdadero si ambos son
A-E
, e igual al mismo número - Devuelve verdadero si ambas son líneas y son idénticas (las banderas de diferentes bots no serán iguales)
- Devuelve verdadero si ambos son
Se colocarán 50 bots de cada tipo en un mundo toroidal con el siguiente patrón:
B...B...B...B...
..B...B...B...B.
B...B...B...B...
..B...B...B...B.
Después de cada juego de 5,000 turnos, se contarán las banderas en cada bot. Obtienes un punto si un bot tiene más de tu bandera que cualquier otro tipo de bandera. Si se trata de un empate entre N
bots, no se otorgan puntos.
Habrá 10 juegos y los puntajes se acumularán al final.
Notas al margen
Los comentarios de fin de línea están permitidos y se denotan con //
Intentar hacer algo que no tiene sentido, como agregar a una línea, no hará nada
Intentar hacer algo en un bot inexistente no hará nada
La recursión infinita en un If
testamento terminará sin que se ejecute ninguna línea.
If
no cambia el valor de C
A Block
no caduca hasta que alguien intente escribirle
Se pueden bloquear varias variables y líneas a la vez
Block
Inventar una variable varias veces se bloqueará varias veces siempre que la segunda instrucción de bloque esté en una línea de código diferente a la primera.
Los espacios solo se permiten entre argumentos (y después del comando)
Si un bot tiene menos de 24 líneas, Flag será el resto de las líneas.
Programa de muestra
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
El programa será ejecutado por mi controlador Python aquí .
El controlador Java está aquí. Es rápido y se ve mucho mejor que el de Python.
Marcador:
- 6837 $ Copia
- 3355 Lockheed
- 1695 MindControl
- 967 bizantino
- 959 AttackOrElse
- 743 Cadmyllion
- 367 Influenza
- 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 Nulificador
- 19 Nanoviris
- 17 aburrido
- 16 Movebot
- 14 Flagbot
- 13 neutralizador
- 12 cáncer
- 9 DNAbot
- 9 parásito
- 8 MetaInsidious
- 8 Rebranding
- 8 AdaptiveBot
- 8 ReproducciónBot
- 8 KungFuBot
- 5 QuickFreezerbot
- 4 atacante
fuente
Respuestas:
Flagbot
¿Por qué molestarse en hacer algo cuando otros bots serán lo suficientemente amables como para darme su código?
fuente
Etiqueta de congelación
Atrapa al oponente en un bucle, llénalo con banderas, pasa al siguiente oponente.
fuente
Copy C+23 C
Esta tiene que ser la línea de código más maliciosa xD.Or would that not count as your flags?
. Porque si no cuentan como sus propias banderas, definitivamente no es una buena soluciónParásito
¿Por qué matar a otros bots? Este bot mira el código del oponente y reemplaza solo las banderas.
fuente
$ Copia
Este bot utiliza muchas de las mismas técnicas que Lockheed de COTO, por lo que pediré prestado y mejoraré descaradamente.
Esto explota una
C
vulnerabilidad para romper bloques e incluso revierte el neutralizador. También está escrito en absolutos debido a esto. Creo que esto podría romperse siC
se restablece el turno, pero mientras el turno sea constante, se puede reescribir para combatirlo.Por alguna razón, la falta de bucle al final hizo que este bot fuera súper bueno.
fuente
C
valores. Por lo tanto, un bloque se puede apilar cuando se llama desde unaIf
declaración, que es el exploit que se usa aquí. $ Copiar rompe bloques (como la almeja) al ejecutarCopy
en la misma línea una y otra vez hasta que tenga éxito, lo que le da una ventaja sobre Lockheed.Lockheed
Mi tercera (y probablemente final) sumisión a esta guerra de bot en particular: el Reactor Lockheed, o "Lockheed" para abreviar.
Un agradecimiento especial a @Wasmoo, que compartió su descubrimiento del "'Bloquear una variable varias veces se bloqueará varias veces siempre que la segunda instrucción de bloqueo esté en una línea de código diferente a la primera'. simplemente no es cierto "explotar. Lo uso ampliamente.
Además, gracias a Nathan Merill por administrar la competencia y por publicar el simulador. El simulador es absolutamente invaluable en el ajuste de bots. No lo habría creído si no lo hubiera simulado con mis propios ojos, pero la adición o eliminación de la función de bot más conceptualmente menor puede significar la diferencia entre un gran éxito y un fracaso absoluto. Tengo dudas sobre si eso es bueno o no.
fuente
If
apuntar a esa línea no fallará), Está bloqueando el mismo valor (Una sola línea puede bloquear las líneas 1-24 con una variable incremental), y el bloque aún no se ha liberado (alguien intentó modificar esa variable)C
,<block target>
) no esté vigente". Es decir, la línea en la que se encuentra la instrucción de bloque no tiene relevancia para el apilamiento, excepto que si el bloque se ejecuta directamente,C
= dirección de instrucción de bloque.Ataque o más
Al ver que a los robots defensivos como Bizantino les iba tan bien, decidí hacer un robot defensivo también.
Esto tiene dos conjuntos de patrones, dependiendo de si el enemigo está presente o no.
alterna entre copiar su bandera y copiar el código que hará que el enemigo copie esa bandera (un replicador débil)que copia su banderaMás pruebas mostraron algunos conceptos importantes:
A+7
mostrado es más efectivo que cualquier otro incremento (+200 sobre el siguiente mejor)Observar la simulación gráficamente a través de la interfaz de usuario de Java ayudó mucho. ¡Gracias! A continuación se muestra el código nuevo y mejorado. No creo que pueda hacer nada más.
fuente
C
que lo bloqueó. Debido a que este bot tiene un Bloque giratorio basado enC
él, acumulará múltiples bloques en cada uno de sus comandos. Eso hace que este bot sea más defensivo.If
línea a una lista, ingresando laC
variable que lo llamó. Entonces, con el 1 Bloque y los 9 Si que ejecutan la declaración de Bloqueo, el bot puede obtener hasta 10 Bloques para cada línea, (tomando al menos 24 * 10 * 10 turnos) Quizás el OP no transmitió la simulación correctamente.Row Bot
Se moverá hasta que encuentre un robot.
Pondrá a ese robot en la misma dirección que él.
Luego copiará su código en el robot.
Esto debería hacer una fila de Robots "Row Bot". :)
fuente
If
declaraciones deben estar en mayúscula. En segundo lugar, no debe haber espacios a ambos lados del=
, comoD=*D
.Super Freeze
Este bot sigue tratando de congelar el bot frente a él hasta que funcione, luego escribe un grupo de banderas en líneas aleatorias, y después de 8 turnos de eso, gira y pasa a otro oponente.
fuente
bizantino
Un bot altamente defensivo que instituye múltiples bloques en sus banderas e instrucciones más sensibles, incluidos metabloques (es decir, bloques en instrucciones de bloque crítico).
También se mueve constantemente de maneras impredecibles, y coloca banderas en numerosos lugares en los oponentes en una base de mejor esfuerzo.
No estoy seguro de cómo funcionará, ya que no puedo simular. Pero lo intentaremos. ;)
Renuncia
Escribí esto antes de ser amablemente informado por PhiNotPi de que la lógica condicional es gratuita. Sin embargo, he decidido dejarlo puesto ya que uno nunca puede tener demasiados bots.
fuente
Cadmyllion
"Acabo de ingresar a un bot en la batalla real", le digo. "Se mueve cada pocos turnos para evitar ataques de robots más lentos".
"¿Qué quieres decir con robots más lentos?" PhiNotPi pregunta.
"Bots que están atrapados evaluando largas cadenas de lógica condicional", respondo.
"Las declaraciones 'If' que redirigen a otras declaraciones --- incluidas otras declaraciones 'if' --- se ejecutan todas en el mismo turno", dice PhiNotPi.
"¡Dulces reglas masacradas del código de ensamblaje!" Lloro. "¿A quién se le ocurrió esa idea?"
... y así es la historia de cómo surgió Cadmyllion.
Cadmyllion: el bot que explota felizmente la capacidad surrealista de evaluar infinitas expresiones condicionales en una sola instrucción ... al hacer que casi todo lo que haga sea condicional.
Código
fuente
Meta Insidioso
Este bot se congela y luego convierte a los oponentes en versiones menos eficientes de Insidious de Sparr , que a su vez, convertirá a los oponentes en bots que marcan spam para mí. Este es probablemente el bot más complejo que he escrito y, por lo tanto, espero que sea terrible, no hubo espacio para bloquear y solo un indicador se ajustó en el código. Convertir un bot en un clon insidioso también lleva demasiado tiempo.
El mayor desafío fue escribir el código para los clones insidiosos de tal manera que funcione independientemente de su posición en el bot. La congelación se elimina cuando pego el penúltimo código exactamente donde se encuentra la congelación, esto inicia al oponente justo a tiempo.
fuente
Repara y protege
Este bot repara su propio código, mientras protege las líneas recién reparadas.
Explicación:
El valor inicial de
A
es0
, y las líneas están numeradas del 0 al 23. Si laIf
declaración se ejecuta y es falsa, intenta ejecutar la misma línea nuevamente. El controlador no permite que un bot ejecute la misma línea dos veces, por lo que el turno finaliza yC
se incrementa a1
.La siguiente línea, en
Copy #A #A+8
realidad se realiza independientemente del valor de laIf
declaración. La diferencia es que se ejecuta dos veces si es verdadero y una vez si es falso. Si la línea#A+8
está bloqueada (lo que sucede eventualmente), realizarla dos veces con copia real, mientras que realizarla una vez solo la desbloqueará. Luego, la línea recién copiada se bloquea para preservarla.fuente
A
? ¿No es así0
? Si es así, su primera línea compara la línea 0 con la línea 16, pero como entendí por el bot de ejemplo de OP, la primera línea es la línea 1, ¿no es así? Además, todavía en su primera línea, se#C
refiere a esta misma línea, entonces, ¿significa que si laIf
declaración devuelve falso está atrapado en un bucle sin fin?Neutralizador
Este bot hace que su víctima reescriba todo su programa, por lo que vale 0 puntos. Una vez que el virus está en su lugar, continúa. Este es un enfoque de tierra quemada para la victoria.
La comparación
*#*C==#7
no parece ajustarse correctamente al cambio del oponente, pero el bot eventualmente avanza.fuente
Copy C+1 C
es todo lo que se necesita para omitir una sola línea.Copy 23 C
allí, para volver a la primera línea.Insidioso
Inspirado por @Cruncher, este bot infecta a otros bots con un pequeño bloque de código, llenando al otro bot con las banderas de este bot. Esos bots son patos sentados para un ataque adicional, pero estarán llenos de mis banderas cuando alguien más los vuelva a infectar.
Editar: gracias a @PhiNotPi por su asistencia en el golf, a @overactor por sus consejos de eficiencia
fuente
Feliz como una almeja
Este es un ejercicio de bloqueo. Funcionó notablemente bien hasta que
$Copy
llegó.La almeja tiene 22 comandos de bloque. Debido a que
A
se desplaza cada bucle, harán referencia a diferentes líneas cada vez a través del bucle. Esto permite que cada comando apile bloques en cualquier otra línea, alcanzando un máximo de 22 bloques por línea. Por lo tanto, para romper la almeja completamente blindada, uno necesitaría escribir 22 veces en una línea.Por ejemplo,
#10
estará protegido cada vez a través del ciclo por las siguientes líneas:#10
protegido por la línea 7 (7+0+3
= 10)#10
protegido por la línea 0 (0+7+3
= 10)#10
protegido por la línea 17 (17+14+3
= 34 = 10)#10
protegido por la línea 10 (10+21+3
= 34 = 10)Entonces, después de la línea 10 del bucle 3,
#10
se ha bloqueado 4 veces, lo que requiere 4 escrituras#10
para romper los bloques, con un quinto para sobrescribir la línea.Tenga en cuenta que los bloques están codificados por su
C
valor y no se apilarán si la línea protegida ya estaba bloqueada por el mismoC
valor. Entonces, después de establecer 22 bloques para cada línea, los bloques ya no se acumularán.fuente
Control mental
¿Supongo que nunca es demasiado tarde?
MindControl surge de mi idea de que tomaría un tiempo considerable copiar todo mi programa al oponente, durante el cual mi bot es vulnerable a los ataques desde otras direcciones. Entonces, ¿por qué no hacer que el oponente copie mi programa mientras escaneo en busca de enemigos?
Una vez que encuentra un enemigo, MindControl inmediatamente lo congela para evitar escapar. Luego carga el descargador al oponente y deja que la víctima descargue el programa MindControl. El descargador explota el hecho de que pocos bots usan
B
y se repetirán hasta que descargue las 24 líneas. Cuando el descargador reescribe#19
desdeCopy 16 C
aCopy 23 C
, significa que la víctima ha descargado todas las líneas y se reiniciará.Las primeras versiones de mi bot no incluyen bloques. Y fue tan vulnerable que casi cualquier cambio es paralizante. Así que decidí agregar Bloques basados en $ Copy de Wasmoo (que se basa en Lockheed de COTO). La desventaja que encontré es que es difícil para el original corregir errores en las copias. Pero esto está lejos de ser paralizante y la puntuación aumentó significativamente, así que mantuve los Bloques.
ACTUALIZACIONES
Mejoré el descargador para seguir intentando descargar hasta una reescritura exitosa para eludir los bloques. ¡Significa que se necesita un turno más para cargar el descargador, pero mi puntaje se duplicó después de este cambio! No puedo discutir con números.
Otra actualización Como habrás notado, MindControl decide si atacar al objetivo comparando una línea aleatoria entre él y su objetivo. Si coinciden, MindControl simplemente asume que el objetivo ya está infectado y lo deja solo. (Nota al margen: solía usar una línea estática para la comparación, pero eso da muchos falsos positivos y negativos) Resulta que da muchos falsos negativos. Así que decidí explotar
==
y hacer algunos cambios triviales comoC+23
a23+C
. El programa es funcionalmente idéntico pero diferente a los ojos de==
. Ahora que MindControl no tiene una línea que sea idéntica a cualquier línea en cualquier otro bot, llegará al 100% a cualquier bot intacto. Nuevamente, el puntaje aumentó significativamente.Mejorado el descargador de nuevo. Ahora se ejecuta en un bucle más corto. (que parece tener una gran correlación con mi puntaje)
Descargador mejorado una vez más. Utiliza el código original del bot para que se cargue más rápido. También se agregaron 2 bloques aleatorios que parecen mejorar la puntuación
fuente
Agresor
fuente
Movebot
Como Flagbot, pero muévete mientras aceptas regalos de código para ir con todas nuestras banderas.
fuente
Bot de reproducción
Este bot intenta congelar a su oponente y luego copiar todo su código en ese bot antes de reiniciar el otro bot. Esto también debería funcionar (principalmente) si el oponente usa el bloqueo, aunque eso lo hace aún más lento de lo que ya es.
fuente
Mago
Magus es un simple intento de un virus que se propaga por sí mismo. Intenta copiarse en los programas de otros bots. (Editado para eliminar números negativos, arreglar condiciones, recortar líneas).
fuente
for (int i = 1; i < 25; i++)
... .DNAbot
Este bot repara su propio código mientras se mueve y ataca.
fuente
Bloqueador
fuente
Imitador
fuente
Congelador rápido
Intenta copiar banderas en la línea que se ejecutará junto a su oponente, se mueve si no hay enemigo para atacar.
fuente
Bloquear, congelar, atacar
Bloquea las 24 líneas, luego realiza un bucle 24 veces moviéndose o atacando, luego se repite. Un ataque implica intentar congelar al oponente, luego copiar cuatro banderas en ubicaciones aleatorias y luego girar.
fuente
Ocultar, bloquear, atacar
Este bot se basa en Block Freeze Attack. Cambié la ubicación de algunas
If
declaraciones para hacerlo más compacto, lo que me permitió plantar más banderas. También tengo que huir al comienzo de un juego para ganar algo de tiempo para bloquear.fuente
Virus itinerante
Este bot deambula hasta que encuentra un enemigo, luego lo congela, reemplaza todo su código con el suyo, lo descongela y luego vuelve a deambular.
fuente
El frio comun
Te infecta prácticamente de inmediato y lo propagarás. basado en el parásito de PhiNotPi , el resfriado común comprueba casi de inmediato si puede copiar su bandera sobre la suya. Bloquea un valor aleatorio si no puede. Se mueve un poco si no hay oponente.
fuente
Influenza
Esto se basa estrechamente en el resfriado común (que se basó en mi parásito) con una velocidad ligeramente mayor.
fuente
Rebranding
Este bot intenta localizar al azar banderas en bots enemigos y reemplazarlas con banderas amigas, alejándose después de detectar el éxito. Inspirado por el cáncer bot.
fuente