Uno de los juegos infantiles más populares entre los niños pequeños es el llamado "Piedra, papel o tijeras". En este juego, dos niños escogen uno de los tres objetos anteriores: si los dos niños escogen el mismo objeto se declara un empate; en otro caso "piedra" pierde con "papel", "papel" pierde con "tijeras" y "tijeras" pierde con "piedra". Así como hay personas buenas para los volados, hay personas buenas en este juego.
Nos enfocaremos en una variante ligeramente más complicada basada en los elementos "agua", "fuego", "viento", "tierra" y "éter". En este juego, cada persona escoge uno de los cinco elementos anteriores: si las dos personas escogen el mismo elemento se declara un empate; en otro caso se declara al ganador con base en la interacción entre los elementos. Por ejemplo, el agua apaga al fuego, el viento erosiona la tierra, etcétera. El diagrama y la tabla de abajo listan las interacciones entre cada pareja de elementos.
Elemento | Vence a |
---|---|
Agua | Éter y fuego |
Éter | Tierra y viento |
Fuego | Éter y viento |
Tierra | Agua y fuego |
Viento | Agua y tierra |
Tu labor será la de escribir un programa en C/C++Compilable con Clang 16 en modo C++ 2023 con manejo de excepciones deshabilitado. Recuerda que casi todo código en C también es válido en C++. que lea una línea con un entero N
y que juegue N
rondas contra un programa escrito por otro competidor. En cada ronda, tu programa deberá imprimir un carácter C
seguido de salto de línea, donde C
indica qué elemento jugarás en esa ronda y que puede ser uno de los siguientes: A para agua, E para éter, F para fuego, T para tierra y V para viento. Una vez realizada la impresión, tu programa podrá leer un carácter y un salto de línea, donde el carácter leído indica qué elemento eligió tu oponente en esa misma ronda. Si tu oponente eligió un valor inválido, el carácter que tu programa leerá será X. Tu programa es libre de usar las utilidades estándar del lenguaje (arreglos, memoria dinámica, inclusión de bibliotecas, etcétera) para intentar predecir y contrarrestar la jugada de tu oponente con base en lo que ha ocurrido en rondas anteriores. Tu programa se ejecutará en un único hilo y no podrá usar recursos externos tales como el almacenamiento secundario, procesos adicionales y conexiones de red.
Tu programa recibirá tres puntos por cada ronda que gane, un punto por cada ronda que empate, y cero puntos por cada ronda que pierda o en la que elija algo inválido (tu oponente recibirá un punto en este último caso). Tu programa deberá poder jugar hasta N
= 104 rondas en menos de 2 segundos y con menos de 64 MiB de memoria. Tu lugar en la tabla de posiciones se calculará con base en la suma de los puntos obtenidos contra cada otro competidor.
Puedes consultar aquí los códigos fuente de los agentes de software o bots contra los que también competirás. Éstos te pueden servir de ejemplo para que programes tu propio agente y participes en el concurso. Consulta un video explicativo.