Demonstrated problem solving ability

Bueno, pues leyendo este requirimiento en una oferta de trabajo, se me ha ocurrido exponer aquí unos ejercicios de lógica que resolví en su día.

El problema de lógica es el llamado «El acertijo lógico más difícil del mundo» propuesto por Raymond M. Smullyan os dejo aquí un enlace a su página de la wikipedia.

La lógica detras de este problema os sonará a muchos de algunas peliculas o acertijos en algunos juegos, se popularizó en una escena de la película de fantasía, Laberinto con David Bowie. En la misma hay dos puertas con dos guardianes. Una puerta conduce al castillo y la otra conduce a «una muerte segura». El acertijo es descubrir que puerta lleva al castillo. Uno de ellos explica que, para saber por qué puerta debe entrar, debe formular una sola pregunta a uno de los dos guardianes, aunque también le afirma que uno dice la verdad y otro miente, con lo cual se complica la elección.

Para resolver este tipo de problemas en la programación encontramos una aliada increible y vamos a ver como resolverlos. Empezaré primero con un codigo sencillo con el viejo Java para resolver el problema del guardián y luego os mostraré como resolver «el acertijo más difícil».

Creamos la tipica estructura:

public class ProblemaGuardian {
 /**
 * @param args the command line arguments
 */
 public static void main(String[] args) {
    // TODO code application logic here
 }
}

Formalizamos las premisas:

  • 2 guardianes uno que dice la verdad y otro miente, tenemos una clase que nos instancia a cada guardian de forma aleatoria con su tipo y otra clase que generará tambien de forma aleatoria las puertas.
Guardian GuardianIzquierda = new Guardian();
Guardian GuardianDerecha = new Guardian();
Puerta PuertaIzquierda = new Puerta();
Puerta PuertaDerecha = new Puerta(); 

De esta forma cada vez que corramos el programa se genera un escenario aleatorio y que se resolverá de forma perfecta si seguimos las premisas.

Controlamos la generación de guardianes y puertas y con un metodo para ello ajustaremos el tipo de cada guardian y puerta para no tener repetidos los mismos tipos.

if (GuardianIzquierda.stipoguardian.equals ("Verdad")){
             GuardianDerecha.AsignarGuardian("Mentira");
}else{
             GuardianDerecha.AsignarGuardian("Verdad");
}

¿Como se resuelve todo esto?

  • Preguntamos al guardian de unas de las puertas, podemos hacerlo al azar si queremos, en este caso elegiré al Guardian de la izquierda.
  • Preguntamos por la respuesta que me daría el Guardian de la derecha. De esta forma llegaremos a la conclusión de que tanto la respuesta de un tipo de guardian o de otro serán la misma independientemente de si miente o dice la verdad.
  • La pregunta seria «Si yo le pregunto al otro guardian si esta puerta conduce a la salvación, ¿Me diria que si?»

Veamoslo en codigo a ver como se resolvería todo.

if (GuardianIzquierda.tipoguardian){ //si el primer guardia dice la verdad y la puerta es la correcta me dira que no
            System.out.println("Guardian tipo verdad Responde: ");
            if(PuertaIzquierda.verdadera){
                System.out.println("- No");                
            }
            else{ // si la puerta no es la correcta
                System.out.println("- Si"); //Como es la puerta incorrecta aqui moririamos entre terribles sufrimientos
            }
}else{ //si el guardian de la izquierda miente entonces veamos las posibles respuestas. Como el guardian mentira en su respuesta dira lo contrario de lo que diria el guardian de la verdad
            System.out.println("Guardian tipo mentira Responde: "); 
            if(PuertaIzquierda.verdadera){//si la puerta es correcta
                System.out.println("- No"); // Aunque realmente esta puerta es la salvacion               
            }else{
                System.out.println("- Si,"); // Aunque aqui mueres
            }                 
        }       
        System.out.println("Asi que una vez contemplados todos los casos sabemos que siempre siempre haremos lo contrario");
}      

Pues con estas sencillas lineas se trazan las posibilidades que encierra este acertijo, seguidamente subire el proyecto a github para poder compartirlo y lo mismo me animo a hacerlo en forma de juego para que se puedan elegir algunas preguntas a los guardianes y de esa forma salvarse o morir en el intento según nuestra elección de la puerta.

0 comentarios en “Demonstrated problem solving abilityAñade los tuyos →

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *