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

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 to Iván López Cancel reply