1

Friday Night Puzzles 20: El error fantasma

fnp20Cada viernes, Robologs propone un nuevo enigma matemático que pondrá a prueba tus capacidades de razonamiento. Todos tienen solución, ya sea utilizando la lógica o con algoritmos y programas sencillos. ¡Te retamos a completarlos todos!

¿Qué tal, seguidores? Como es costumbre los Viernes, publico un nuevo artículo de mi columna semanal Friday Night Puzzles, en que recopilo algunos de los puzzles más interesantes que caen en mis servos. Hoy continuaré con la série de enigmas de programación con uno de sencillo, tan sencillo que es difícil de resolver.

Pero pirmero os daré una respuesta oficial al enigma de la semana pasada.

Respuesta al enigma de la memoria limitada:

El código necesario para cambiar las dos variables será:

void intercambio(int &a, int &b)
{
   a ^= b;
   b ^= a;
   a ^= b;
}

¿Qué tipo de Magia Negra de la Computación es esto? El operador ^= significa hacer una operación booleana de tipo XOR entre las dos variables. Recordemos que la operación booleana XOR sigue esta tabla de verdad:

xor-table

Por lo tanto, si aplicamos este algoritmo a variables del mismo tipo, se va a intercambiar su valor. ¿No os lo créeis? Encontré un esquema con un ejemplo bastante ilustrativo:

xor_swapPodemos ver claramente como el algoritmo de intercambio XOR funciona con cualquier variable, siempre y cuánto sean del mismo tipo.

¿Y para qué puede servirnos este algoritmo? ¿No es más fácil utilizar una variable temporal que comparar los dos valores bit a bit? En la gran mayoría de casos sí: el algoritmo de intercambio XOR es mucho más ineficiente y lento que utilizar una variable temporal. Sin embargo, en casos como los que planteaba el problema en los que disponemos de una memoria muy limitada puede interesarnos no reservar memoria para variables.

El error fantasma

Tenemos este código en lenguaje C puro y duro. Aparentemente está todo correcto, sin embargo tiene un error muy estúpido. Sin compilar el programa, ¿podéis decir de qué error se trata?

#include<stdio.h>

void OS_Solaris_print()
{
        printf("Solaris - Sun Microsystemsn");
}

void OS_Windows_print()
{
        printf("Windows - Microsoftn");

}
void OS_HP-UX_print()
{
        printf("HP-UX - Hewlett Packardn");
}

int main()
{
        int num;
        printf("Enter the number (1-3):n");
        scanf("%d",&num);
        switch(num)
        {
                case 1:
                        OS_Solaris_print();
                        break;
                case 2:
                        OS_Windows_print();
                        break;
                case 3:
                        OS_HP-UX_print();
                        break;
                default:
                        printf("Hmm! only 1-3 :-)n");
                        break;
        }

        return 0;
}

 

Y hasta aquí el artículo de hoy. Si os gustan este tipo de problemas volveré la semana que viene con uno diferente y daré la respuesta oficial al acertijo que he planteado hoy. Si queréis, se puede dejar la respuesta en los comentarios.

Eso sí: ¡Mirad el código con lupa!

lupa

N4n0

Creado para cuidar de los sistemas de laboratorios tan secretos que ni él tiene la seguridad de estar trabajando en ellos, a Nano le gusta dedicar los ciclos que no gasta en tapar agujeros de Firewall para dedicarse al hobby de la electrónica o a ver películas de ciencia ficción. Entre su filmoteca de culto, ocupan un lugar destacado Tron, The Matrix y Johnny Mnemonic.

Antes de comentar, por favor, lee las Normas

1 Comentario en "Friday Night Puzzles 20: El error fantasma"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
wpDiscuz