Proyecto de Diseño de Algoritmos

Trimestre 2009 Otoño
Entrega: 8 de diciembre de 2009 a las 22:00.

Douglas Hofstadter sugirió alguna vez el siguiente juego llamado "Intercambio de bolsas": Dos personas se encuentran e intercambian bolsas cerradas, en el entendido de que una contiene dinero y la otra contiene una compra. Cada una de las personas puede elegir cumplir con su palabra (poniendo dentro de su bolsa lo que se había acordado) o no cumplir con su palabra (poniendo alguna cosa sin valor dentro de la bolsa).

Obviamente una persona "gana mucho" si recibe lo que quiere a cambio de nada, "gana" si recibe lo prometido a cambio de lo prometido, "no pierde" si recibe nada a cambio de nada y "pierde" si no obtiene nada a cambio de lo prometido.

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 regreso será 1 o 0 según tu función escoja poner lo prometido dentro de la bolsa o no, respectivamente. Por otro lado, P podrá tomar un valor negativo para indicar que es el primer juego de una serie de juegos o los valores 0 o 1 para indicar cuál fue la tirada anterior de tu contrincante. El nombre de tu función deberá ser el login que se te asignó durante el curso. Tu función no podrá usar ninguna variable global (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 se incluirán los archivos de encabezado math.h, stdio.h, stdlib.h y string.h (de modo que podrás utilizar las funciones matemáticas, de números aleatorios, de cadenas, etc.).

Al final, yo escribiré un programa que realice un torneo entre todas las funciones que ustedes hayan escrito. Un partido de ese torneo enfrentará a dos funciones, las cuales jugarán una cierta cantidad grande (al menos 100) de juegos consecutivos. Si "ganas mucho" en un juego se te otorgarán 3 puntos, si "ganas" 2 puntos, si "no pierdes" 1 punto y si "pierdes" 0 puntos. Si tu función regresa un valor ilegal perderás un punto (y el otro "gana mucho" a menos que regrese un valor ilegal también). Nota que en el torneo también competirá tu función contra sí misma. Por cierto, yo también escribiré algunas funciones y (aunque no pretendo ganar el torneo) también competirán contra ellas. Abajo les muestro ejemplos de funciones con las propiedades que se piden en esta tarea.

La evaluación será como sigue: 10 puntos si entregas la tarea y tu función "cumple su palabra" al menos una vez en cada partido. Por lo demás, la función que más puntos acumule recibirá 25 puntos adicionales y las demás funciones recibirán una cantidad proporcional de puntos (con la excepción de las funciones que nunca cumplen su palabra, las cuales recibirán también 0 puntos).

int franz_cumplido(int p)
{
  return 1;
}
int franz_copia(int p)
{
  return (p < 0) ? 1 : p;
}
int franz_volado(int p)
{
  return rand() % 2;
}

Nota: Hace unos trimestres dejé una tarea parecida. El programa resultante está aquí.