[ create a new paste ] login | about

Link: http://codepad.org/51fSSqsi    [ raw code | output | fork ]

C, pasted on Apr 28:
/* PRESOS5.C
 * PRESOS Y SOMBREROS
 * Los presos se representan como una tabla de enteros que podra
 * tener dos valores: 0-sombrero blanco, o 1-sombrero negro.
 * La elección de cada preso se representa como otra tabla de
 * enteros siguiendo la misma codificación.
 */

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

int i,e;

int sombrero[31];
int eleccion[31];

int salvados;
int ejecutados;

main() {
   printf("PRESOS Y SOMBREROS\n");
   printf("Codificacion: 0-blanco 1-negro\n");

   Repartir_sombreros();
   Aplicar_estrategia();
   Mostrar_resultado();
}

Repartir_sombreros() {
   /* Aleatoriamente se asignan sobreros a cada uno de los 30 presos. */

   printf("Repartiendo sombreros...\n");

   srand(time(0));
   for (i=1; i<=30; i++) {
      sombrero[i]= rand()%2;
      printf("%i",sombrero[i]);
   }
   printf("\n");
}

Aplicar_estrategia() {
   /* Se aplica un algoritmo recursivo que va llamando cada vez a un caso
    * mas simple, que sera la respuesta del anterior preso.
    * - en el caso base, la respuesta del primer preso depende de si es par o
    *   impar el número de sombreros negros que ve.
    *      -si dijo blanco, ha visto un n£mero par de sombreros
    *      -si dijo negro, ha visto un n£mero impar de sombreros
    * - en otro caso, 
    *      - hará una llamada a la función Respuesta para escuchar la
    *        respuesta del preso anterior.
    *      - contará los sombreros negros que han ido diciendo sus compañeros,
    *        quitando el primero, que habrán ido acertando.
    *      - si la suma de los que ha oido mas los que ve es del mismo orden
    *       (par o impar) que los que vio el primer preso, entonces
    *          elegir blanco
    *      -sino
    *          elegir  negro
    */

   printf("Aplicando estrategia (relativa a sombreros negros)...\n");
   printf("Eleccion:\n");

   e=Respuesta(30);
}


void Respuesta (int i) {
   int j,oidos,vistos,r;

   vistos=0;
   for (j=i+1; j<=30; j++) {
      vistos=vistos+sombrero[j];
   }
   if (i==1)
   {
      r=vistos%2;
      printf("El preso  1 ve %2i sombreros, y elige %i.\n",
	   vistos,r);
   }
   else
   {
      Respuesta(i-1);
      oidos=0;
      for (j=2; j<i; j++) {
         oidos=oidos+eleccion[j];
      }
      if ((oidos+vistos)%2==eleccion[1]%2)
         r=0;
      else
         r=1;        
      printf("El preso %2i lleva contados %2i sombreros y ve %2i sombreros, luego elige %i.\n",
 	      i,oidos,vistos,r);
   }
   eleccion[i]=r;
   return 0;
}



Mostrar_resultado() {
   /* Se muestra el resultado comparando las respuesta de cada preso con el sombrero que
    * lleva, indicando si coincide (y se salva) o no (y le matan).
    */

   printf("Mostrando resultado...\n");

   salvados=0;
   ejecutados=0;

   for (i=1; i<=30; i++) {
      printf("El preso %2i ha elegido %i y su sombrero era %i",i,eleccion[i],sombrero[i]);
      if (eleccion[i]==sombrero[i])
      {
	 printf(", luego se salva.\n");
	 salvados++;
      }
      else
      {
	 printf(", luego le matan.\n");
	 ejecutados++;
      }
   }
   printf("Se han salvado %i y han ejecutado a %i.\n",salvados,ejecutados);
   return 0;
}


Output:
PRESOS Y SOMBREROS
Codificacion: 0-blanco 1-negro
Repartiendo sombreros...
011100110111101100101010001110
Aplicando estrategia (relativa a sombreros negros)...
Eleccion:
El preso  1 ve 17 sombreros, y elige 1.
El preso  2 lleva contados  0 sombreros y ve 16 sombreros, luego elige 1.
El preso  3 lleva contados  1 sombreros y ve 15 sombreros, luego elige 1.
El preso  4 lleva contados  2 sombreros y ve 14 sombreros, luego elige 1.
El preso  5 lleva contados  3 sombreros y ve 14 sombreros, luego elige 0.
El preso  6 lleva contados  3 sombreros y ve 14 sombreros, luego elige 0.
El preso  7 lleva contados  3 sombreros y ve 13 sombreros, luego elige 1.
El preso  8 lleva contados  4 sombreros y ve 12 sombreros, luego elige 1.
El preso  9 lleva contados  5 sombreros y ve 12 sombreros, luego elige 0.
El preso 10 lleva contados  5 sombreros y ve 11 sombreros, luego elige 1.
El preso 11 lleva contados  6 sombreros y ve 10 sombreros, luego elige 1.
El preso 12 lleva contados  7 sombreros y ve  9 sombreros, luego elige 1.
El preso 13 lleva contados  8 sombreros y ve  8 sombreros, luego elige 1.
El preso 14 lleva contados  9 sombreros y ve  8 sombreros, luego elige 0.
El preso 15 lleva contados  9 sombreros y ve  7 sombreros, luego elige 1.
El preso 16 lleva contados 10 sombreros y ve  6 sombreros, luego elige 1.
El preso 17 lleva contados 11 sombreros y ve  6 sombreros, luego elige 0.
El preso 18 lleva contados 11 sombreros y ve  6 sombreros, luego elige 0.
El preso 19 lleva contados 11 sombreros y ve  5 sombreros, luego elige 1.
El preso 20 lleva contados 12 sombreros y ve  5 sombreros, luego elige 0.
El preso 21 lleva contados 12 sombreros y ve  4 sombreros, luego elige 1.
El preso 22 lleva contados 13 sombreros y ve  4 sombreros, luego elige 0.
El preso 23 lleva contados 13 sombreros y ve  3 sombreros, luego elige 1.
El preso 24 lleva contados 14 sombreros y ve  3 sombreros, luego elige 0.
El preso 25 lleva contados 14 sombreros y ve  3 sombreros, luego elige 0.
El preso 26 lleva contados 14 sombreros y ve  3 sombreros, luego elige 0.
El preso 27 lleva contados 14 sombreros y ve  2 sombreros, luego elige 1.
El preso 28 lleva contados 15 sombreros y ve  1 sombreros, luego elige 1.
El preso 29 lleva contados 16 sombreros y ve  0 sombreros, luego elige 1.
El preso 30 lleva contados 17 sombreros y ve  0 sombreros, luego elige 0.
Mostrando resultado...
El preso  1 ha elegido 1 y su sombrero era 0, luego le matan.
El preso  2 ha elegido 1 y su sombrero era 1, luego se salva.
El preso  3 ha elegido 1 y su sombrero era 1, luego se salva.
El preso  4 ha elegido 1 y su sombrero era 1, luego se salva.
El preso  5 ha elegido 0 y su sombrero era 0, luego se salva.
El preso  6 ha elegido 0 y su sombrero era 0, luego se salva.
El preso  7 ha elegido 1 y su sombrero era 1, luego se salva.
El preso  8 ha elegido 1 y su sombrero era 1, luego se salva.
El preso  9 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 10 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 11 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 12 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 13 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 14 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 15 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 16 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 17 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 18 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 19 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 20 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 21 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 22 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 23 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 24 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 25 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 26 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 27 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 28 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 29 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 30 ha elegido 0 y su sombrero era 0, luego se salva.
Se han salvado 29 y han ejecutado a 1.


Create a new paste based on this one


Comments: