Introducción
Estás varado en una isla desierta con algunos sirvientes y estás buscando tesoros. Cuanto más se busca, más tesoros se encuentran. Cuantas menos personas buscan, más encuentra cada persona.
Debido a los suministros limitados, el líder ha decidido que algunas personas, hasta una cuarta parte del grupo, se dejarán morir cada noche. Ha decidido no decirle a nadie exactamente cuántas personas morirán en un día determinado antes de tiempo.
Tienes el control de un pequeño grupo de 5 personas, que se aventurarán a salir del campamento para encontrar un tesoro para ti.
Objetivo
El objetivo de esta competencia es acumular la mayor cantidad de tesoros posible. Cada vez que tus sirvientes no intenten regresar al campamento, encontrarán una cierta cantidad de tesoros. Tus sirvientes pueden regresar al campamento en diferentes momentos.
En cada turno que un trabajador se queda fuera para buscar tesoros, el trabajador encuentra 1+R
piezas de tesoros, donde R
está el número de trabajadores (de todos los bots) que ya están en el campamento. Los bots muertos no tienen en cuenta este cálculo.
Al comienzo de cada día, se elegirá un número aleatorio ( n
) de 2
a max(3, floor(num_live_players/4))
. (Para 10 jugadores en el día 1, esto es 2
para max(3,50/4)=12
. Para 20 jugadores en el día 1, esto sería 2
para max(3,100/4)=25
.) Este número representa el número de jugadores que se dejarán morir ese día, y no serán entregados a su programa. .
Si un sirviente es una de las últimas n
personas en regresar, él / ella morirá y no podrá transferir el tesoro que encontró a su posesión. Además, el sirviente no podrá participar en la búsqueda del tesoro por el resto de la aventura.
Su puntaje final es la cantidad promedio de tesoro que obtuvo por aventura (ejecución del controlador).
Si más personas intentan regresar al campamento en el mismo turno que las franjas horarias abiertas, los números aleatorios determinarán quién entra y quién muere.
Un día en esta isla desde el amanecer hasta el atardecer dura 30 turnos. Como hay muchos animales peligrosos por la noche, no regresar al atardecer significa que no se le permitirá ingresar al campamento.
De entrada y salida
Su programa debe ejecutarse durante toda la simulación.
Al comienzo de la simulación, INDEX I
se ingresará, donde I
está el índice de su bot (este índice se cuenta desde 1 hacia arriba).
Al comienzo de cada día, START_DAY D/N
se ingresará a su programa, donde D
está el número de día (a partir de 1
), y N
es igual a max(3, floor(num_live_players/4))
, que es el número máximo de personas que pueden morir en ese día en particular.
Al comienzo de cada turno, START_TURN T
se ingresará a su programa, donde se T
encuentra el número de turno (a partir de 1
).
Una vez que su programa recibe esto, debe responder con una lista de los movimientos de sus servidores, cada uno separado por una coma.
Los movimientos válidos son:
R
: Intenta volver al campamento.S
: Sigue buscando tesoros.N
: El sirviente ya está muerto o en el campamento.
Ingresar un movimiento no válido se interpretará como S
si el bot estuviera vivo y no en el campamento, y de lo N
contrario.
Al final de cada turno, se pasará una cadena a su programa:
END_TURN [Turn #] [Bot 1 Moves] [Bot 2 Moves] ...
donde los movimientos de los sirvientes de cada bot están separados por comas.
Estos movimientos serán uno de los siguientes:
R
: Con éxito regresó al campamento ese turno.r
: No se pudo regresar al campamento ese turno.S
: Todavía estoy buscando tesoros.D
: Murió en un turno anterior.N
: Ya de vuelta en el campamento.
Los bots y los servidores permanecen en el mismo orden durante toda la simulación.
Por ejemplo:
INDEX 2
....
END_TURN 8 N,N,N,N,N r,r,r,r,D D,D,D,N,R S,D,D,N,D
Aquí, usted es el segundo bot ( r,r,r,r,r
), que intentó devolver los cuatro servidores que aún están vivos (y desafortunadamente fallaron en los cuatro). Los sirvientes de Bot 1 están de vuelta en el campamento. Bot 3 tiene tres sirvientes muertos, uno más en el campamento y un quinto sirviente que regresó con éxito. Bot 4 tiene un sirviente que se quedó (y morirá, ya que este es el último turno de un día), un sirviente en el campamento y tres sirvientes muertos.
Después de cada una de estas cadenas, a menos que también se haya emitido una cadena que indique el final del día (ver más abajo), su programa es generar los próximos movimientos de sus servidores, separados por comas. Todos los sirvientes deben ser contabilizados (con N
si ya están en el campamento y D
si ya están muertos). Los movimientos inválidos serán tratados como S
si el sirviente no estuviera en el campamento / muerto. Ejemplo:
N,N,S,S,R
lo que significa:
Servant # | Action
1 | Do nothing.
2 | Do nothing.
3 | Stay put (keep looking for treasure).
4 | Stay put (keep looking for treasure).
5 | Try to return to camp.
Al final de un día, se pasará la siguiente secuencia después de la secuencia del último turno END
, informando a todos sobre quién está vivo:
END_DAY [Day #] [Bot 1 Status] [Bot 2 Status]
donde el estado es una lista separada por comas de A
(vivo) o D
(muerto). El día siguiente comienza inmediatamente después.
La simulación finaliza cuando hay menos de 6 servidores en vivo. Su programa recibirá la siguiente entrada al final de la simulación:
EXIT
Reglas / Detalles
- Solo en los turnos donde está tu acción
S
encontrarás tesoros. - Número de simulaciones ejecutadas: 1000 veces
- Su programa no debería tomar más de 1 segundo para determinar movimientos.
- Su programa no debe salir temprano; Se iniciará exactamente una vez.
- Asegúrese de que el búfer de salida (si corresponde) se vacía después de cada salida.
- Los archivos se pueden escribir en la carpeta de su bot (
./players/BotName/
). Su nombre de bot es el nombre que le dé a su bot, con todos los caracteres no alfanuméricos eliminados y escritos en CamelCase. Las entradas pueden guardar datos entre ejecuciones del controlador, ya que las ejecuciones se realizan de forma secuencial. - Su programa debe salir después de recibir
EXIT
. - Los programas que no compilan o arrojan errores o generan texto inválido (no en el formato de 5 caracteres separados por comas) pueden ser excluidos de la competencia. Una nueva línea debe seguir cada salida.
- El controlador se puede encontrar en GitHub .
Incluya el nombre del bot, idioma + versión, código y comando para compilar (si corresponde) y ejecutar su bot.
Ejemplo
El texto generado por el programa tiene el prefijo aquí con a >
. Su programa no debería generar este carácter.
INDEX 2
START_DAY 1/3
START_TURN 1
>S,S,S,S,S
END_TURN 1 S,R,S,S,S S,S,S,S,S
START_TURN 2
>S,S,S,S,S
END_TURN 2 S,N,S,R,S S,S,S,S,S
START_TURN 3
>R,R,S,S,S
END_TURN 3 R,N,R,N,R R,R,S,S,S
START_TURN 4
>N,N,S,S,S
END_TURN 4 N,N,N,N,N N,N,S,S,S
START_TURN 5
>N,N,R,R,R
END_TURN 5 N,N,N,N,N N,N,r,r,R
END_DAY 1 A,A,A,A,A A,A,D,D,A
START_DAY 2/3
START_TURN 1
>S,S,N,S,N
END_TURN 1 R,R,R,R,R S,S,D,D,N
END_DAY 2 A,A,A,A,A D,D,D,D,D
EXIT
Los puntajes para el ejemplo anterior son:
Bot# Day 1 Day 2 Total
1 10 0 10
S1 1+2 0 3
S2 0 0 0
S3 1+2 0 3
S4 1 0 1
S5 1+2 0 3
2 20 0 20
S1 1+2 0 3
S2 1+2 0 3
S3 0 0 0
S4 0 0 0
S5 1+2+3+8 0 14
Por lo tanto, el ganador es el jugador, bot 2. Tenga en cuenta que el ganador no tiene que sobrevivir hasta el final absoluto. (También tenga en cuenta que el jugador podría haber permanecido hasta el turno 30 en el día 1, ya que el campamento no estaría lleno hasta que el jugador devolviera un bot más).
Puntuaciones
Bot Score
Bob 2939.422
Statisticians 2905.833
Morning Birds 1652.325
Evolved 1578.285
Slow Returners 1224.318
Wandering Fools 1065.908
Randomizers 735.313
Drunkards 0
Plague 0
Los registros están disponibles en GitHub . Los resultados de cada prueba están disponibles en esta hoja de cálculo de Google .
fuente
Respuestas:
Bob - C ++
Compilar:
Correr:
fuente
Estadísticos, Python 3
Los estadísticos siempre trabajan juntos. En el primer turno, regresan al campamento cuando dos tercios de sus oponentes lo han hecho. En los turnos posteriores, confían en los datos que han recopilado de los turnos anteriores para predecir los hábitos de los otros sirvientes e intentan regresar al campamento en el último momento seguro.
Programa
Como puede ver, robé descaradamente la estructura del programa de @Mike Sweeney.
Mando
EDITAR: se corrigió un error en el cheque para regresar a casa. Deberían funcionar algo mejor ahora.
EDITAR 2: Los estadísticos ahora son más inteligentes que antes: realizan un seguimiento de los sirvientes que han regresado al campamento en el día actual y ajustan sus predicciones en consecuencia. Además, corren más riesgos y regresan al campamento cuando quedan 3/4 del número máximo de sirvientes moribundos. Esto los empuja a la cima (apenas; Bob se ha vuelto muy peligroso).
fuente
Borrachos, Perl 5
Demasiado alcohol y nunca encontrarán el camino de regreso al campamento.
Esta entrada es principalmente un ejemplo, pero participará.
Programa
Mando
fuente
$status[$i] eq 'A' ? 'S' : 'D';
sea$status[$i] eq 'A' ? 'S' : 'N';
para cumplir con la especificación?Pájaros de la mañana
¡¡¡El pájaro temprano atrapa al gusano!!!
Editar: Hecho para que cualquiera pueda subclasificarlo fácilmente. Simplemente redefina
doMove(int playerNumber)
para su propio bot. He agregado varios campos y métodos útiles. Lo he probado ampliamente. Lo hace , no guardar los estados de las simulaciones anteriores. Por favor dime si hay algún problema.Compilar con:
javac ./players/MorningBirds/MorningBirds.java
Corre con:
java players.MorningBirds.MorningBirds
fuente
R
) en un día dado siempre morirá ese día.Aleatorizadores - Ruby
Solo para arruinar los bots basados en estadísticas, los aleatorizadores son bastante impredecibles. Todos ellos regresan a la vez, en un turno aleatorio en un intento de varar a otros.
(No influenciado por otros jugadores).
fuente
Tontos errantes, Python 2
Este es un simple robot de Python que envía a los sirvientes hasta que se alcanza un tiempo de "regreso" preestablecido, luego intentan ingresar al campamento y quedarse hasta el día siguiente.
También es un marco básico para bots más complejos que otros pueden desear usar. Sin embargo, no se ha probado con el motor de jueces, así que avíseme si he cometido un error.
Programa
Mando
Editar: Se modificó el código de decisión de la acción después de la aclaración de la regla.
fuente
Evolucionado
Utilicé la programación genética (a través de JGAP) para hacer este bot. Se le ocurrió una respuesta simple que supera a todos los demás (apenas).
Compilar con:
javac players/Evolved/Evolved.java
Corre con:
java players.Evolved.Evolved
Editar: Grrr ... Bob me arruinó!
Editar: Yay !!! ¡Bob, fue asesinado por una desagradable plaga!
fuente
SlowReturners - Ruby
Envía un sirviente de regreso cada 5 turnos.
fuente
Plaga
La peste es una enfermedad. No es racional Es predecible Las enfermedades no pueden recoger tesoros, ni les importa el tesoro. La peste enferma a otros jugadores. Los sabios se quedan en casa y se olvidan del tesoro. Los necios son siempre necios y nunca obtendrán mucho tesoro. Evolucionado es (afortunadamente) inmune a la peste. Él también es sabio. Él va y recoge tesoros, y no muere.
Compilar con:
javac players/Plague/Plague.java
Corre con:
java players.Plague.Plague
Bob y los estadísticos ahora son resistentes a la peste.
fuente