sábado, 15 de noviembre de 2008

Solución y otras cosas

A continuación se muestra la solución al problema planteado en el último post. Para verla hacer click aquí.


El programa eventualmente se detiene, pero después de unas 22040 iteraciones del loop externo. Por lo tanto, para fines prácticos, puede considerarse como un loop infinito... Es claro que devuelve cero, ya que tuvo que salir del loop externo para poder terminar. A continuación se describe con algo más de detalle el funcionamiento del programa.

Es claro que el único punto confuso es la acción de la línea "while (!++*p++);", el resto del programa es bastante normal. Para interpretarla, puede verse teniendo en cuenta la prioridad de los operadores que es equivalente a realizar "while (!(++(*(p++))));". Esto corresponde a:
  1. Incrementar p devolviendo su valor original, que podemos llamar p'.
  2. Incrementar el valor apuntado por p'.
  3. Si el valor apuntado por p' es ahora 0, volver al paso 1. En caso contrario, salir.
Como buffer se inicializa con ceros al ser variable global y p apunta inicialmente a buffer[0], tenemos que en la primera iteración del loop externo:
  • (1) p <-- &buffer[1]
  • (2) buffer[0] <-- 1
  • (3) Sale porque buffer[0] != 0
En la segunda iteración tendremos:
  • (1) p <-- &buffer[1]
  • (2) buffer[0] <-- 2
  • (3) Sale porque buffer[0] != 0
Esto continuará hasta que buffer[0] sea 255. En ese momento sucederá lo siguiente:
  • (1) p <-- &buffer[1]
  • (2) buffer[0] <-- 0
  • (3) Vuelve a "1" porque buffer[0] == 0
  • (1') p <-- &buffer[2]
  • (2') buffer[1] <-- 1
  • (3') Sale porque buffer[1] != 0
Si se observa el comportamiento en detalle, puede verse que tenemos un contador en el que cada posición de buffer actúa como un dígito base 256. Para salir es necesario que al finalizar el loop interno p sea igual a q. Pero esto implicaría que se acaba de incrementar a buffer[255], lo que no sucederá hasta que hayan ocurrido 256255 == 28*255 == 22040 iteraciones del loop externo.


En otro área completamente diferente, encontraron en México una caverna llena de extraordinarios cristales de yeso hidratado (sulfato de calcio):


En el sitio de National Geographic pueden observarse otras fotos espectaculares y más detalles sobre el descubrimiento (por ejemplo, el porqué de los trajes naranjas :-). (Via Robin Hanson.)

No hay comentarios: