Cartel editorial: el triangulo de la Regla 30 de Wolfram sobre cuatro generaciones de un glider de Conway.
Ingeniería

Runtime de autómatas celulares

EstadoEn vivo
RolIngeniería
Año2024
Stack
canvas 2dtypescriptreact

Resumen

Un motor de Conway y Wolfram sobre Canvas 2D, con controles en vivo y patrones precargados, embebido dentro de las entradas del lab.

Por qué Canvas y no WebGL

A esta resolución de retícula el cuello de botella es la lógica, no el pintado. Contar vecinos para cada celda es trabajo de CPU, y moverlo a la GPU no lo acelera: lo reparte, y luego cobra el viaje de vuelta.

Hay una razón más terca. Estos motores viven embebidos dentro de las entradas del lab, y algunos aparecen en tarjetas de vista previa. Montar un contexto WebGL para una miniatura que quizá nadie mire es caro de una forma que no se mide en frames por segundo, sino en memoria y en contextos que el navegador limita por pestaña.

Dos autómatas, dos formas de pintar

Los dos motores dibujan retículas de celdas, y ninguno de los dos dibuja igual. No por descuido: es que no cambian la misma cantidad de cosas por frame.

Conway repinta el mundo entero en cada generación —cualquier celda puede nacer o morir— así que pintar celda por celda serían miles de llamadas de dibujo para un solo fotograma. En su lugar escribe los píxeles a mano dentro de un ImageData y lo vuelca de una sola vez con putImageData.

Wolfram no. Un autómata elemental añade una fila por generación y no toca nunca lo ya dibujado; la historia se acumula hacia abajo como un registro. Ahí fillRect por celda es lo correcto, y montar un búfer de píxeles completo para escribir una fila sería más código y más trabajo.

Figura pendiente/media/projects/conway-canvas-runtime/01-painting.webp

La regla es un número

La parte que más me gusta de los autómatas elementales es que la regla no se programa, se cuenta. Hay ocho vecindades posibles —tres celdas, dos estados— y la regla dice qué sale de cada una. Ocho respuestas binarias son ocho bits, o sea un número entre 0 y 255.

Así que "Regla 30" no es un nombre: es la tabla misma, escrita en decimal. Construirla es leer sus bits.

ts
const table = new Uint8Array(8);
for (let index = 0; index < 8; index += 1) {
  table[index] = (rule >> index) & 1;
}

Toda la variedad del sistema —desde el triángulo caótico de la 30 hasta el tráfico de la 184— sale de esas tres líneas.

Las cuatro clases

Wolfram clasificó estos comportamientos en cuatro familias, y el runtime la muestra junto a la regla porque es lo que convierte el juguete en un instrumento: uniforme, periódico, caótico y —la interesante— la clase IV, donde aparecen estructuras localizadas que se desplazan e interactúan. La Regla 110 está ahí, y es Turing completa.

Figura pendiente/media/projects/conway-canvas-runtime/02-classes.webp

Embebido en el lab

Ninguno de los dos motores sabe que existe una página. Reciben su configuración —tamaño de celda, densidad inicial, regla, velocidad— desde el registro del lab, y lo que se guarda ahí es un objeto de configuración por entrada.

Eso es lo que permite que una misma entrada del lab publique varias demostraciones sin duplicar el motor, y lo que hace que la vista previa de una tarjeta y el runtime a pantalla completa sean literalmente el mismo código con distintos números.

Más proyectos



SESSION_ELAPSED00:00:00
LOCALE: ESENV: PROD