El Teorema del Mono Infinito

Por Andrés Ibáñez Núñez. (La entrada ha sido actualizada.)

Es un hecho probado que un mono tecleando aleatoria e indefinidamente en una máquina de escribir acabará por redactar cualquier obra literaria que haya existido o pueda existir. No importa cual sea la combinación de caracteres: el mono, a base de ser pesado y nunca parar, acabará por teclearlos. Este programa, escrito en lenguaje C, reproduce este hecho para una cadena cualquiera de minúsculas y espacios. Aviso: para más de 6 caracteres, el mono suele tardar tanto que igual vuestro ordenador se ahorca de impaciencia (cuelga). Pero no importa, el mono siempre acaba por ganar. Para más información, pulse aquí.

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
int main()
{
    
    //Declaración de variables.
    int i, cierto;
    unsigned long long int n=0;
    char m[100];
    
    //Texto introductorio.
    printf("\n\n\n\tBienvenido.\n");
    printf("\tEl Teorema del Mono Infinito afirma que un mono pulsando teclas \n");
    printf("al azar sobre un teclado, durante un periodo de tiempo infinito podrá \n");
    printf("escribir íntegramente cualquier obra de Shakespeare.\n\n");
    printf("\tAunque no lo vea, detrás de esta pantalla se encuentraun mono \n");
    printf("mecanógrafo aleatorio. Escriba, usando solo minusculas y espacios, \n");
    printf("la frase que le gustaría que tecleara para usted:\n\n\n");

    /* Lectura de la cadena por teclado. Más de cinco caracteres empieza a ser demasiado para este propósito.
    Una vez probé con "verdes", tuvo que repetir el bucle 815 853 778 veces antes de terminar.
    La "ñ" no funciona. */
    gets(m);

    //Declaración de un nuevo array de tantos caracteres, f, como la cadena introducida.
    int f=strlen(m);
    char v[100];
    
    //Comprueba la lectura y pausa.
    printf("\tSu frase es:\n\%s\n\n", m);
    printf("\tPara que los monos comiencen a teclear, pulse ENTER.\n");
    getchar();
    
    //Inicializa el array v.
    for(i=0; i<f; i++){
        v[i]=0;
    }
    
    //Usa el reloj del ordenador como semilla para generar números pseudoaleatorios.
    srand(time(NULL));
    
    do{
        //Inicializa el booleano "cierto".
        cierto=0;
        
        /* En cada paso, se asigna un número aleatorio entre el 97 y el 123,
        (que se corresponden con las minúsculas y el espacio) al último elemento de v y se imprime.
        Resulta en pantalla una larga cadena de caracteres de forma que, cada vez,
        los f últimos se corresponden con los elementos de v. */
        
        for(i=0; i<f-1; i++){
        v[i] = v[i+1];
        }
        
        v[f-1] = rand()%27 + 97;
        if(v[f-1] == 123) v[f-1] = 32;
        
        printf("%c", v[f-1]);
        
        //n es un contador de las veces que se repite el bucle.
        n++;
        
        //El bucle se repite hasta que los elementos de v se corresponden con los primeros f elementos de m.
        for(i=0; i<f; i++){
            cierto=cierto+(m[i]==v[i]);
        }
        cierto = cierto/f;
        
    } while(!cierto);
    
    //Resultado del programa y despedida.
    printf("\n\n\tLos monos lo consiguen a base de ser pesados, ¿somos más los humanos?\n");
    printf("%lld teclas han tenido que pulsar, solamente.\nHasta siempre.\n\n", n);
    return 0;
}
Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s