En este desafío, debes diseñar una especie de organismos unicelulares para luchar hasta la muerte en el campo de las placas de Petri. La arena se representa como una cuadrícula rectangular, donde cada celda ocupa un espacio:
.....x....
...x...o..
...x.c..o.
.......o..
Atributos
Cada celda tiene tres atributos. Al especificar su especie celular al comienzo del juego, asigna 12 puntos entre estos atributos.
- Puntos de vida (HP): si el HP de una celda cae a cero, muere. Las nuevas celdas tienen HP total.
- Cuando una célula muere, deja un cadáver que otras células pueden comer para obtener energía.
- Una celda no puede recuperar HP perdido, pero puede crear una nueva celda con HP completo al dividirse.
- Energía : la mayoría de las acciones que puede realizar una célula requieren energía. Al descansar activamente, una célula puede recuperar la energía perdida hasta el máximo de su especie.
- Es probable que falle una especie celular con menos de 5 energías, porque no puede dividirse para crear nuevas células.
- Una célula no puede recuperar energía más allá del valor máximo de su especie.
- Una celda recién creada tiene un valor de energía inicial copiado de su padre (y un valor máximo dictado por su especificación de especie).
- Acidez : si una célula elige explotar, el nivel de acidez de la célula se usa para calcular el daño a las células adyacentes.
Comportamiento
Cada turno, cada celda puede tomar una acción:
Mover: la celda se mueve un espacio en cualquier dirección (N / S / E / W / NE / NW / SE / SW) a un costo de 1 energía.
- Una célula no puede moverse a un espacio ocupado por otra célula viva.
- Una celda no puede moverse fuera de la cuadrícula.
- Pasar a un cadáver celular destruye el cadáver.
Ataque: una célula ataca a una célula adyacente e inflige 1 a 3 daños, gastando 1 a 3 puntos de energía.
- Una célula puede atacar en cualquier dirección (N / S / E / W / NE / NW / SE / SW).
- Es legal atacar células amigas.
Divide: la celda se divide y crea una nueva celda en un espacio adyacente, a un costo de 5 de energía.
- Una celda puede dividirse en cualquier dirección (N / S / E / W / NE / NW / SE / SW).
- La nueva celda tiene HP completa de acuerdo con las especificaciones de su celda original.
- La nueva celda tiene tanta energía como su celda principal después de restar el costo de división. (Por ejemplo, una celda principal con 8 puntos de energía iniciales se reducirá a 3 de energía y producirá una celda secundaria con 3 de energía).
- Una nueva celda no puede actuar hasta tu próximo turno.
- Una célula no puede dividirse en un espacio ocupado por una célula viva, pero puede dividirse en un espacio ocupado por un cadáver de células muertas (esto destruye el cadáver).
Comer: una célula come un cuerpo celular adyacente, ganando 4 de energía.
- Una célula puede comer en cualquier dirección (N / S / E / W / NE / NW / SE / SW).
Descanso: una célula no hace nada durante un turno, recuperando 2 de energía.
Explotar: cuando una celda tiene 3 HP o menos y más energía que HP, puede optar por explotar, causando daño a las ocho celdas adyacentes.
- El daño a cada celda adyacente es
(exploding cell HP) + (explodng cell acidity)
- Una célula explotada muere y deja un cadáver, al igual que las células muertas en la explosión.
- El daño a cada celda adyacente es
Protocolo
Preparar
Su programa se ejecutará con la cadena BEGIN
provista en stdin. Su programa debe escribir en la salida estándar una lista separada por espacios de 3 enteros no negativos, lo que representa HP, la energía, y la acidez de su especie de la célula: por ejemplo, 5 6 1
. Los números deben sumar 12. La acidez puede ser 0
, si lo desea. (Otros atributos también pueden ser cero, ¡pero hacerlo funcionalmente pierde el juego!)
Comienza con una celda, en la esquina noroeste o sureste, a un espacio de cada borde. La celda inicial tiene HP y energía completos.
Cada célula actúa
Cada turno, su programa se invocará una vez por cada célula viva de su equipo (excepto las células que acaban de crear este turno) para que la célula pueda actuar. Su programa cuenta con datos sobre stdin que incluyen el estado de la placa de Petri e información sobre esta celda en particular:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
Los dos primeros números indican el ancho y la altura de la arena: aquí, hay una arena de 10 por 4.
- Las
o
celdas son tuyas; Lasx
células son tus enemigos. (Esto siempre es cierto; cada jugador siempre ve sus propias células comoo
). - Los
.
espacios están vacíos. - Los
c
espacios representan cadáveres celulares comestibles.
Los números después de la línea vacía representan información sobre esta celda:
- Los primeros dos números son
x,y
coordenadas, indexadas0,0
en la parte superior izquierda (por lo que6 3
aquí se refiere al extremo suro
celda ). - El tercer número es el HP de la celda; El cuarto número es la energía de la célula.
Su programa debería generar (para stdout) una acción. En los ejemplos a continuación, usaremos N
como una dirección de ejemplo, pero puede ser cualquier dirección legal para esa acción ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ SW
). Toda la salida del programa no distingue entre mayúsculas y minúsculas, pero los ejemplos usarán mayúsculas. Cualquier acción de salida que no sea válida (ya sea porque tiene una sintaxis no válida o intenta una acción ilegal) se ignora y da como resultado la celda REST
(y, por lo tanto, gana 2 energías).
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- el número representa la fuerza del ataque (1 - 3)REST
EXPLODE
El turno de su equipo consiste en que todas sus células tengan la oportunidad de actuar, una por una. Todas sus células actúan antes que cualquiera de las células del oponente. Una vez que todas sus células actúan, su turno termina y comienza el turno de su oponente. Una vez que actúan todas las células de tu oponente, tu turno comienza de nuevo. Dentro de su turno, cada célula tiene prioridad para actuar en función de su edad: las células más antiguas de su equipo actúan primero antes que las células más jóvenes.
Ejemplo
Así es como podría comportarse un programa. La entrada de stdin se denota aquí con >
flechas iniciales (separadas de la entrada real por un espacio de aclaración) y la salida en stdout tiene <
flechas.
> BEGIN
< 5 6 1
Luego, el programa se invoca nuevamente:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
Después del turno de su oponente (que decidió hacerlo DIVIDE W
con la celda inicial simple), su programa se invoca dos veces, una para cada celda:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
Para la segunda invocación en su turno:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
Tenga en cuenta que esta segunda celda ve el estado actualizado del tablero en función del movimiento de la otra celda anteriormente en su turno. También tenga en cuenta que esta celda se ha creado con 1 energía, porque la celda principal tenía 6 energías cuando realizó la división el último turno (por lo que el 6 original, menos el costo de división de 5 energías, creó una celda secundaria con 1 energía).
Ahora su turno ha terminado y comienza el turno de su oponente. Las dos celdas opuestas tendrán la oportunidad de actuar, y luego comenzará su próximo turno.
Victoria
Puedes ganar por:
- Destruyendo todas las celdas opuestas, o
- Tener más células que tu oponente después de que cada jugador haya completado 150 turnos
La puntuación se basará en el número de victorias en 100 juegos entre sí. En la mitad de las simulaciones, su programa podrá ir primero.
Los juegos de empate (es decir, exactamente el mismo número de celdas después de 150 turnos, o las únicas celdas restantes se matan juntas en una explosión) no se cuentan en el total de victorias de ninguno de los jugadores.
Otra información
- Su programa no debe intentar mantener el estado (más allá del uso del estado de la placa de Petri): los organismos monocelulares no tienen muy buena memoria y reaccionan ante el mundo momento a momento. En particular, la escritura en un archivo (u otro almacén de datos), la comunicación con un servidor remoto o la configuración de variables de entorno están explícitamente prohibidas.
- Los envíos se ejecutarán / compilarán en Ubuntu 12.04.4.
- Los detalles de los 100 juegos de puntuación aún no están confirmados, pero probablemente involucrarán múltiples tamaños de arena (por ejemplo, 50 carreras en una arena pequeña y 50 carreras en una arena más grande). Para una arena más grande, puedo aumentar el conteo máximo de turnos para asegurarme de que pueda tener lugar una batalla adecuada.
Recursos
Aquí está el código del conductor que ejecuta la simulación, escrita para Node.js, llamada por node petri.js 'first program' 'second program'
. Por ejemplo, podría parecer una celda escrita en Python contra una celda escrita en Java node petri.js 'python some_cell.py' 'java SomeCellClass'
.
Además, entiendo que leer y analizar varias líneas en stdin puede ser un gran dolor, por lo que he redactado algunas celdas de muestra completas en diferentes idiomas que puede construir, revisar o ignorar por completo.
- Celda Java
- Célula Python
- Celda de JavaScript (para usar con Node.js)
Por supuesto, eres libre de escribir una celda en un idioma diferente; Estos son simplemente tres idiomas para los que decidí escribir código repetitivo para ayudar a ahorrar tiempo.
Si tiene algún problema al ejecutar el controlador, no dude en enviarme un ping en la sala de chat que he creado para este desafío . Si no tiene suficiente reputación para chatear, simplemente deje un comentario.
'node c:/cell/cell_template.js'
para cada argumento, tal como necesitaría especificar'java CellTemplate'
el código Java. Lo aclararé en el texto del desafío. Si todavía tiene problemas, nosotros (y cualquier otra persona con problemas técnicos) podemos continuar esta discusión en una sala de chat que acabo de hacer .