05 marzo 2011

Juego de la vida (1ra parte)


Hace poco, conocí a través del libro "El gran diseño" de Stephen Hawking, el "juego de la vida" de Conway.

Este "juego" -entre comillas- me resultaba conocido, ya que en alguna vieja distribución de Linux, había visto algo similar. Pero hasta hace unos días no tenia ni la menor idea de que se trataba.

Pero basta de misterios, les cuento muy brevemente de que trata.

La idea es que uno tiene una gran grilla con celdas. Las celdas tienen una configuración inicial: vivas (activadas) o muertas (desactivadas). A partir de esta configuración inicial se deja correr el tiempo -que son pasos discretos. A cada paso se determina que celdas nacen o mueren según unas reglas muy simples:


  • Si la celda esta viva pero no tiene vecinos: , en la siguiente generación muere:   
  • Si la celda esta viva pero tiene entre 2 o 3 vecinos: , en la siguiente generación permanece viva: 
  • Si la celda esta muerta pero tiene 3 vecinos: , en la siguiente generación se transforma en una celda viva: 
  • Si la celda tiene más de 3 vecinos, muere.

Notar que cuando se evalúa el estado de las celdas, es como si se sacara una foto: las reglas se evalúan en base al estado de esa foto.

Hasta acá nada interesante, ¿Donde esta la gracia de todo esto?
La gracia esta en que dependiendo de la configuración inicial, si uno deja correr el "tiempo" las celdas cobran vida. Hasta el punto que es posible simular una maquina de Turing!

El aprendizaje de todo esto, es que "formas de vida" muy simples pueden dar lugar a comportamientos muy complejos. Algo que menciona Douglas Hofstadter en su libro Gödel-Escher-Bach cuando hace la analogía entre las neuronas y las colonias de hormigas.

Como ven esto es algo muy interesante y simple de implementar a la vez :)
Por eso lo use como excusa para hacer algunos experimentos con JavaScript, experimento que pueden bajar de este link.

Nota:
El link contiene un WAR (Java Web Application Archive) que no es más que un archivo .zip.
Pero no necesitan Java, ni Tomcat o Jetty para probarla.
La razón por la que use un WAR es la siguiente: quisé hacer tambien el experimento de usar LESS (un lenguaje de macros para CSS -altamente recomendable).
LESS incluye una version JavaScript que pueden usar en el cliente... pero desafortunadamente usa un XMLHttpRequest para bajar el CSS, y por razones de seguridad browsers como Chrome lo filtran.
Por eso termine haciendo una aplicación web, que usa un servlet para LESS (tenia otras opciones, pero quería probar LESS y esta opción era más sencilla que instalar Node.js en Windows).
El uso de LESS no es necesario, pueden jugar con el ejemplo sin necesidad de levantar una aplicación web: abran directamente el archivo index.html dentro del war.
En el próximo post les cuento como desarrolle esta pequeña implementación (que usa jQuery, Raphael y local storage).

Mientras tanto les recomiendo jugar con patrones como este (pueden usar la opción de Save/Load para guardar/recuperar el patrón del local storage):