Trimestres anteriores‎ > ‎2015-P‎ > ‎1151047 - Bases de datos‎ > ‎

Piedra - Papel - Tijeras - Lagarto - Spock

Día de entrega: 15 de julio de 2015 al correo racc.uam@gmail.com (sólo se aceptará código fuente)

Uno de los juegos infantiles más popular entre los niñospequeños es el llamado "Piedra, papel o tijeras". En este juego,dos niños escogen uno de los tres objetos anteriores: si los dosniñ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 losvolados, hay personas buenas en este juego.

Nosotros nos enfocaremos en una variable ligeramente más complicada llamada "Piedra - Papel - Tijeras - Lagarto - Spock", la cual fue introducida en la popular serie de televisión "La teoría del Big Bang". En este juego, se escogen uno de los cinco objetos anteriores: si las dos personas escogen el mismo objeto se declara un empate; en otro caso se declara el ganador en base al siguiente diagrama:

Tu labor será la de escribir una función en C++ que acepte un parámetro P de tipo int y que regrese un int. El valor de retorno será 1, 2, 3, 4, o 5 según tu función escoja tirar "piedra", "papel", "tijeras", "lagarto" o "Spock" respectivamente. Por otro lado, P podrá tomar el valor 0 para indicar que es la primera ronda de una serie de juegos o los valores 1, 2, 3, 4 o 5 para indicar cuál fue la tirada anterior de tu contrincante.

El nombre de tu función deberá terminar con la cadena "_matrícula" donde "matrícula" debe ser reemplazado por tu matrícula de la UAM. Tu función no podrá variables globales ni memoria dinámica (aunque sí podrá usar variables static), no deberá solicitar ninguna entrada ni generar ninguna salida (incluyendo a través de archivos) y deberá compilar suponiendo que tu archivo fuente incluye las siguientes inclusiones y directivas:

   #include <algorithm>
   #include <bitset>
   #include <climits>
   #include <cmath>
   #include <cstdio>
   #include <cstdlib>
   #include <cstring>
   #include <functional>
   #include <numeric>
   using namespace std;

Tu función además deberá poder ejecutarse correctamente en el juez en línea OmegaUp y no debe usar más de 8MB de memoria. Yo escribiré algunas funciones de prueba con las que podrán compararse usando OmegaUp. Pueden descargar un código de ejemplo que se ejecuta correctamente en OmegaUp.

Al final, yo escribiré un programaque ponga a competir cada posible pareja de funciones. Un "enfrentamiento" entre dos funciones consistirá en al menos 1000 rondasconsecutivas. Si ganas una ronda se te otorgarán 3 puntos, si empatas 1 punto y si pierdes0 puntos. El ganador de un enfrentamiento no obtiene puntos adicionales; sólo obtiene la suma de los puntos obtenidos en las rondas. Tu función no competirá contra sí misma.

Si tu función se ejecuta incorrectamente puede quedar descalificada; si regresa un valor ilegal perderásun punto y tu contrincante ganará 1 punto (suponiendo que él tiró algo válido). Si tu contrincante tira algo inválido, ése será el valor de P que tu función reciba en la siguiente ronda, por lo que deberán validar P para evitar que su función se comporte incorrectamente. Por cierto, yotambién escribiré algunas funciones y (aunque no pretendoganar el torneo) también competirán contra ellas. Abajoles muestro ejemplos de funciones con las propiedades que se piden eneste ejercicio.

La función que sume el mayor número depuntos después de todos los enfrentamientos recibirá 30 puntos extras sobre la calificación de su tercer examen (cuyo puntaje máximo será de 35), la peor función recibirá 0 puntos y losdemás recibirán una cantidad proporcional.

int piedra_203305906(int p)
{
   return 1;
}
int copia_203305906(int p)
{
   return (p == 0 ? 1 : p);
}
int volado_203305906(int p)
{
   return 1 + (rand( ) % 5);
}