En el futuro, cuando el viaje en el tiempo (abreviado como TT) sea común, el lanzamiento de monedas se convertirá en un deporte mental serio. Para prepararnos para el futuro, creamos una competencia para programas en los que viajar en el tiempo realmente sucederá desde los puntos de vista de las entradas.
La competencia es un King of the Hill de round-robin que consiste en partidos de lanzamiento de monedas entre clases Java.
Reglas del partido de lanzamiento de monedas
- Hay dos jugadores y 100 rondas.
- En cada ronda se lanza una moneda y, según el resultado, uno de los jugadores obtiene 1 punto. Cada jugador tiene un 50% de posibilidades de ganar un punto.
- Después del lanzamiento, ambos jugadores tienen la oportunidad de controlar el tiempo tirando de las palancas.
- Si tira de una palanca azul (revertir el tope) no es posible TT a la vuelta que se utilizó la palanca o cualquier vuelta anterior. El intento de TT de ir a estas rondas no tendrá efecto.
- Si tira de una palanca roja (reverter) , intenta revertir el tiempo a una ronda anterior. Si tiene éxito, la memoria del oponente se revertirá. a su memoria antes de la ronda elegida y los resultados del lanzamiento de la moneda a partir de la ronda elegida también se eliminarán . El único signo posible para tu oponente sobre el TT será el número de palancas no utilizadas que no se revertirán.
- Cada jugador tiene 5 palancas azules y 20 rojas sin usar al comienzo del partido. Estas palancas no se ven afectadas por los TT.
- Si no ocurre un TT al final de una ronda número 100, el juego termina y gana el jugador con el puntaje más alto.
Detalles
- Las rondas tienen una indexación basada en 1 (forma 1 a 100).
- Antes de la ronda
x
, se le proporciona el número de palancas azules y rojas disponibles, los resultados del lanzamiento de la moneda hasta el turnox
(inclusive) y el recuerdo de su (último)x-1
ronda. - Al tirar de una palanca azul en la ronda, se
x
detiene cualquier TT que tenga un destino en la rondax
o antes (bloquea un TT si sucede en la misma ronda exacta también). - Volver a la ronda
x
significa que la próxima ronda será redondax
. - Si ambos jugadores eligen revertir al final de una ronda, el tiempo se revierte al destino anterior que no está bloqueado. Los jugadores que intentaron volver a este tiempo mantendrán su memoria.
Detalles técnicos
- Debería escribir una clase Java implementando la interfaz Bot proporcionada.
- Agrega tu bot al proyecto.
- Agregue una instancia de su Bot al
Bot
archivoController.java
. - Su clase no debe guardar información entre llamadas . (En la mayoría de los casos, tener solo
final
variables fuera de las funciones satisface este requisito). - Puede proporcionar información al controlador en el
memory
campo de suAction
objeto devuelto . Esto se le devolverá en el próximo turno si no sucedió TT. Si ocurre un TT, recibirá la memoria anterior correspondiente. - Puede usar el
totalScore()
método de laGame
clase para obtener la puntuación de una cadena de historial.
Protocolo
En cada turno
takeTurn(...)
se llama a su método con 5 argumentos:- la cantidad de palancas azules no utilizadas
- la cantidad de palancas rojas no utilizadas
- el historial de lanzamiento de monedas, una cadena que consiste en 1 y 0 que marcan sus ganancias y pérdidas en las rondas anteriores. El primer personaje corresponde al primer lanzamiento de moneda. (En la primera ronda, la longitud de la cuerda será
1
). - una cadena, su memoria almacenada de la ronda anterior
- el índice basado en 1 de esta ronda
En cada giro, su método devuelve un
Action
objeto que contieneun número entero en el
move
campo que describe su acción:0
para ninguna acción-1
tirar de una palanca azul y bloquear los TT que pasan por esta ronda- un entero positivo
x
, no mayor que la ronda actual, para tirar de una palanca roja e intentar volver a la rondax
- Los enteros no válidos se tratan como
0
.
una cadena que contiene su memoria de esta ronda que desea conservar. Tenga en cuenta que almacenar memoria no es una parte crucial del desafío . Puede realizar buenas entradas sin almacenar datos útiles en la cadena. En la primera ronda, la cadena será una cadena vacía.
Su método no debería demorar más de 10 ms por ronda en promedio en un partido.
- El incumplimiento regular del límite de tiempo resulta en la descalificación.
Puntuación
- Ganar un partido gana 2 puntos y un empate gana 1 punto para ambos jugadores. La pérdida no gana puntos.
- La puntuación de un bot será el número total de puntos que recolectó.
- El número de partidos jugados entre cada par de concursantes dependerá del número de entradas y su velocidad.
Dos ejemplos simples de bots se publican como respuestas.
El controlador y los primeros Bots están disponibles aquí. .
Resultados de la prueba con bots enviados hasta el 3 de noviembre .:
Puntajes totales:
Oldschool: 3163
Random: 5871
RegretBot: 5269
Nostalgia: 8601
Little Ten: 8772
Analyzer: 17746
NoRegretsBot: 5833
Oracle: 15539
Deja Vu: 5491
Bad Loser: 13715
(El controlador se basa en el controlador del desafío Cat catcher . Gracias por @flawr que lo proporciona como base para este.)
Bonificación: una bonita película de 6 minutos basada en un concepto similar.
fuente
If you pull a blue lever (revert stopper) no TT is possible through that round anymore. TT's attempting to go through the round will have no effect.
¿Qué es "pasar por una ronda"?If you pull a blue lever (revert stopper) no TT is possible to the round the lever was used or any earlier round anymore. TT's attempting to go to these rounds will have no effect.
Respuestas:
Analizador
Esto analiza el pasado para hacer las mejores predicciones para el futuro.
EDITAR: evita los tiempos de palanca azul. Utiliza palancas azules de manera efectiva. Utiliza palancas rojas de manera más efectiva. Más miedo para la temporada de Halloween.
EDITAR: corregido por 1 error.
EDITAR:
computeWinningProbability
Función mejorada . Ahora usa palancas rojas y palanca azul de forma más agresiva.Puntuación (desde el 2 de noviembre):
fuente
Nostalgia
No probado, solo una puñalada rápida para tratar de hacer un bot que es difícil de bloquear (porque decide cuándo tirar de la palanca roja principalmente al azar) pero eso toma decisiones decentes.
Editar: me perdí esta regla:
Esa parece ser una buena razón para usar la memoria: si recuerdas haber intentado realizar un TT en una ronda determinada, es posible que hayas fallado, por lo que no deberías intentar volver a TT en esa ronda. Edité mi bot para tratar de evitar esto.
fuente
Oráculo
Copié descaradamente algún código de Analyzer (para analizar la memoria). Esta sumisión trata de tirar de una palanca azul temprano y luego aumenta lentamente su ventaja. Creo que el rendimiento de este bot compensa el código feo :)
fuente
LamentoBot
Al final de
nuestra vida,el partido, lamentamos nuestros fracasos pasados e intentamos volver y arreglarlos.fuente
Pequeño diez
Little Ten multiplica y divide mucho entre 10, usando números que son múltiplos de 10 y volviendo a las rondas que son múltiplos de 10.
Editar: cambió la mecánica un poco ahora que la explicación de lo que sucede cuando se tira de una palanca azul es más clara. También hice un poco de reequilibrio.
fuente
Aleatorio
La estrategia de Random es la siguiente:
fuente
NoRegretsBot
fuente
Mal perdedor
Este bot no usa memoria y es sorprendentemente bueno (pero no supera a Analyzer u Oracle).
fuente
Vieja escuela
Este bot nunca realiza ninguna acción, ya que Oldschool no cree en los viajes en el tiempo.
fuente
Deja Vu Bot
Este bot intenta rastrear cuando tira del azul para evitar que el rojo entre en esa región. Solo tirará de las palancas rojas cuando esté significativamente atrás en la puntuación.
fuente