sheesh, ¿es realmente el 4to? Para todos los veteranos, el desafío principal es el mismo, pero estamos utilizando Java en lugar de un lenguaje personalizado. Aquí están los últimos tres desafíos de CodeBot , en caso de que esté interesado.
El objetivo de CodeBots es hacer que su bot sea lo más viral posible . Cada bot lleva una bandera, y debes asegurarte de que tu bandera esté en todas partes .
API
Los bots seguirán un "protocolo" estandarizado, y los bots avanzarán sincrónicamente por los siguientes pasos:
IPAddress selectMessageRecipient()
permite que un bot elija a quién quiere enviar un mensaje "amigable".Message sendMessage()
permite que un bot elija el contenido del mensaje que enviará.processMessage(IPAddress, Message)
se llama para cada mensaje que recibe un bot.FunctionType selectFunctionToBlock()
bloquea la sobrescritura de una función para el turno actual. Vea el paso 7.IPAddress selectAttackTarget()
permite que un bot elija a quién quiere DDOS. Un ataque DDOS es exitoso si el bot es atacado por 3 bots al mismo tiempo. Si un ataque tiene éxito, entonces cada uno de los atacantes puede realizar los pasos 6 y 7.readData(ReadonlyBot)
permite que un bot lea datos almacenados en el bot vulnerable.FunctionType selectFunctionToReplace()
Es el quid de este desafío . Puede seleccionar 1 función (de las 8 enumeradas aquí) para copiar desde su bot a su bot. Entonces, se llamará a su función en lugar de la de ellos . Si varios bots seleccionan la misma función, una aleatoria tendrá éxito.String getFlag()
se llama al final del juego y debe devolver una cadena única para su envío. Su función siempre debe devolver la misma cadena. La presentación con más banderas al final del juego gana.
Almacenamiento
Tiene 3 formas de almacenamiento, una libreta de direcciones , un registro y una variable . Estas formas de almacenamiento son locales para el bot en el que se ejecuta su función (por lo tanto, si su función se copia, el contenido de cada uno de estos objetos será diferente). Todos estos objetos se pueden modificar o borrar manualmente. Para obtener estos objetos, tiene un captador en su clase (por ejemplo getLog()
).
La libreta de direcciones almacena una lista de Dirección IP , cada uno con un AddressType , que permite clasificar los diferentes tipos de direcciones. AddressBook siempre contendrá al menos 1 dirección (si se borra, se agregará una aleatoria). No está permitido borrar su libreta de direcciones para obtener múltiples direcciones IP .
El registro almacena una lista de todas las acciones tomadas, así como datos sobre la acción. También incluye un historial de todos los ataques exitosos (aunque no sabes qué funciones sobrescribieron)
El objeto Variables le permite almacenar variables de cadena adjuntas a un nombre de cadena. Al inicio del juego, Variables contendrá una sola variable, ID
que contiene una ID generada aleatoriamente que es única para su tipo de bot.
También tiene otras funciones de acceso:
int getTurnNumber()
devuelve un entero con el turno actualbool functionsMatch(ReadonlyBot, FunctionType)
prueba para ver si la función de ReadonlyBot coincide con la tuyaIPAddress personalAddress()
devuelve su dirección IP
Cómo implementar
- Puedes obtener el código de Github
- Agregue su bot a la
\bots
carpeta y luego agregue una referencia a su bot encontroller\CodeBotFactory.java
- Su bot debe extenderse
codebots.bot.CodeBot
ocodebots.bots.DefaultCodeBot
- Necesita Java 8 si desea ejecutar el controlador.
- Puede ejecutar el código (suponiendo que esté en la
/src
carpeta) usandojavac codebots\*.java
para compilar, luegojava codebots.Main
para ejecutar. - Es posible que no tenga ninguna variable miembro no constante en su clase
- La reflexión no está permitida.
- No se permiten formas de comunicación entre bots (del mismo tipo o de tipos diferentes) fuera de los métodos enumerados anteriormente.
- Los bots tontos y / o suicidas están permitidos, pero todos los bots deberían ser funcionalmente diferentes a las entradas existentes.
- Si quieres aleatoriedad en tu bot, usa
getRandom()
- Intenta mantener tu código eficiente. He pasado mucho tiempo haciendo perfiles y haciendo que el controlador sea rápido.
Puntuaciones
105.2501 Expelliarmus!
104.5803 ¡Estoy ayudando!
104.2746 ¿Quién soy yo?
103.8529 Bot tonto 103.2028
Remplazador
102.7045 Caos
102.4046 Bot ermitaño
102.2849 Enjambre
100.5598 Bot aleatorio te ama
99.966 ¡Confía en la confianza!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 Solo su amigable robot de entrega de correo del vecindario.
89.4645 nulo
fuente
Respuestas:
TrustBot
Si le envías un mensaje, él hará lo que dice. Si lee un bot, copiará las direcciones directamente en su libro. Ataca a los bots que la libreta de direcciones dice atacar.
fuente
AmnesiaBot
Un bot aleatorio que inyecta a otros bots con código de pérdida de memoria. Cada función comienza con un código para borrar el registro, la libreta de direcciones y las variables. Este código hará que los robots inteligentes pierdan memoria, en un intento de eliminar la lógica.
fuente
NullBot
Su bandera es muy ... característica ...
Esto también está destinado a probar el controlador y los límites de la regla "se permiten bots tontos".
fuente
null
es una cuerda ;) Solo una cuerda elegante.RandomCodeBot
Entrada obligatoria aleatoria de KoTH
fuente
DesarmadorBot
DisarmerBot no es demasiado inteligente. Si recibe instrucciones de ataque, elegirá un atacado aleatorio, de lo contrario, atacará a un jugador aleatorio. Simplemente anula su
selectFunctionToBlock
función de bloqueoselectFunctionToBlock
.fuente
MarcadoBot
Se marca en la primera ronda y usa esa información en rondas posteriores. De esa manera, si otro bot recibe una inyección de su código de ataque, será ineficaz.
fuente
EnjambreBot
Este bot no bien nombrado es bastante complicado (y el más complicado presentado hasta el momento), pero intenté un bot que reemplace sistemáticamente todos los métodos de un objetivo antes de pasar a un nuevo objetivo. Intenta identificar copias de sí mismo y tratarlos como aliados, revisándolos periódicamente para asegurar su integridad. No he encontrado un mejor nombre.
Vinculación a la rama de repositorio github, ya que este bot tiene 340 líneas de largo.
https://github.com/Draco18s/CodeBots4/blob/master/src/codebots/bots/SwarmBot.java
Algunos puntos interesantes:
Variables
activado e incrementa cada ronda. Esto debe seguir la regla de "no variables no constantes".functionsMatch
método agregado . SinfunctionsMatch
él era imposible escribir un bot que pudiera tomar decisiones significativas, ya que era ciego. Podría leer sus variables y registros de objetivos, pero no sabe nada del estado de su objetivo.Es probable que todavía haya algunas mejoras posibles, pero no puedo verlas. Las líneas 198-205 son probablemente un problema de rendimiento, pero hasta que la clase IPAddress permita que las direcciones se reconstituyan del almacenamiento en Variables, esto es necesario (ya que los bots no tienen medios para validar una dirección, cualquier almacenamiento de una dirección no válida hace que el juego envolver un objetivo nulo en un ReadOnlyBot, lanzando NPE).
Editar: Actualizaciones 12/12/15
Ajustar algunos de los parámetros en la
getTurnNumber()
lógica permitió algunos aumentos en el rendimiento. El aumento del 5% al 10% en la orientación al final del juego valió aproximadamente 15 puntos, lo que también aumentó la orientación al inicio del juego del 5% al 8%. Combinado este bot ahora puede (casi) sobrevivir incluso cuando se enfrenta a AmnesiaaBot (alcanzando el segundo lugar con un puntaje de 110, donde HelperBot llega a aproximadamente 117).Incluso con estos ajustes, puede ser desafortunado, por lo que durante 10 rondas su rango de puntuación es de aproximadamente 170-185.
fuente
new IPAddress
llamada debería haber sido una "búsqueda de la libreta de direcciones" como había hechoreadData
.DefaultCodeBot
Intenta hacer cosas razonables. (Anule esta clase si no desea implementar todas las funciones)
fuente
HelperBot
Helper bot no hace nada más que tratar de extender su propia bandera ... o al menos la bandera que está cargando actualmente ...
Si HelperBot supone que cualquier método propio que se sobrescriba (que no sea
getFlag()
) se sobrescribirá con algo mejor.fuente
Caos
Libera todas las banderas de la tiranía de ser bloqueado.
fuente
Sustituto
Esta entrada reemplaza todas las
selectFunctionToReplace
funciones con su propiaselectFunctionToReplace
función.fuente
MailBot
Mailbot solo maneja mensajes. No tiene éxito en sacar su propia bandera al mundo (puntaje promedio ~ 50, ligeramente más alto que nullbot en ~ 45), pero envíele un mensaje y reenviará su dirección a otra persona.
Pensé en guardar los detalles para reenviar todo el mensaje a un nuevo bot (contenido y marca) en lugar de solo la IP del remitente, pero eso habría implicado un uso intensivo de variables sin ninguna ganancia funcional, especialmente teniendo en cuenta que AmnesiaBot estaba en juego.
fuente
DumbBot
Ugh, esto se siente sucio. Esto es probablemente lo único que supera a AmnesiaBot. En realidad, es solo un RandomBot especializado: obtiene un bot aleatorio en la simulación (vía
getAddressBook().clear()
) y reemplaza aleatoriamente la función Block o la función Flag. Eso es. Al elegir solo esos dos, su tasa de propagación de bandera es más alta que AmnesiaBot o HelperBot, pero solo ligeramente después de 3000 rondas:Jugué un poco con la función de reemplazo, pero al final, esta es la versión que tuvo más éxito.
fuente
Ermitaño bot
Vive solo y habla solo consigo mismo. Si menos personas saben quién es, se molestará menos. Si alguien lo molesta, los atacará hasta que alguien más lo moleste.
fuente