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; } |