Alba on Tech

Talking about technology

Kata: Intercambio de variables

Es de sobra conocido el mito de que las personas ciegas agudizan el resto de sentidos para compensar su ceguera. En realidad, el resto de sus sentidos no están más agudizados. Simplemente, les prestan mayor atención, trabajan más con ellos, y los exprimen al máximo. Eso mismo ocurre en muchos aspectos de la vida. Cuando tenemos una carencia, optimizamos los recursos que tenemos. En nuestra profesión nos encontramos con carencias con frecuencia: consumo de memoria, velocidad de procesador, transmisión de datos… Hay muchos aspectos que pueden provocar un problema, y nos vemos forzados con frecuencia a utilizar el ingenio para solventarlos. Un ejemplo que me gusta mucho es este artículo: 1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond, donde explican como solventaron los problemas de sincronización del juego Age of Empires frente a las carencias de red. Es largo, pero merece la pena, os lo recomiendo.

Así que, para aguzar un poco nuestro ingenio, os propongo una Kata con una carencia artificial. Es un problema clásico, así que puede que ya lo conozcáis. Se trata de intercambiar dos variables. Lo habitual es hacer esto de la siguiente forma:

a = 2
b = 3
temp = a
a = b
b = temp

Lo que os propongo es que penséis la forma de conseguir esto mismo, pero sin usar ninguna variable adicional. En los comentarios pondré las dos soluciones que conozco, pero seguro que hay más. ¿Se te ocurre alguna?

Y recuerda, no se trata de un concurso. Se trata de una kata. Practica y mejora. Siempre

Advertisements

22 October, 2013 - Posted by | Kata

3 Comments »

  1. La solución más sencilla que conozco es mediante sumas.
    a= 2
    b = 3
    a = a+b // a = 3 + 2 = 5
    b = a -b // b = 5 – 3 = 2
    a = a -b // a = 5 – 2 = 3

    Otra, muy curiosa, es mediante XOR, repitiendo tres veces la misma sentencia. Está muy bien explicada aquí: http://betterexplained.com/articles/swap-two-variables-using-xor/

    a = a ^ b
    b = a ^ b
    a = a ^ b

    Comment by Pablo Alba | 22 October, 2013 | Reply

  2. Con groovy es muy sencillo (aunque supongo que es trampa y no es lo que estás buscando):

    a = 2
    b = 3

    (a,b) = [b,a]

    println a // -> 3
    println b // -> 2

    Comment by Iván López | 22 October, 2013 | Reply

  3. Llegué aquí a través de Miguel de la Cruz. Hace meses de esto, pero aquí tenéis mi solución.
    Es dependiente de arquitectura (x86), pero es rápido (muy rápido) y atómico:

    int a = 2, b = 3;

    asm(“xchg %0, %1” : “=r”(a), “=m”(b) : “0”(a));

    printf(“%d, %d\n”, a, b); // 3, 2

    Comment by Javier López | 28 March, 2014 | Reply


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: