Autómata de Energía ∅ INIT

La energía busca equilibrio. Las anomalías emergen. El sistema fluye hacia la estabilidad.
Lenguaje: JavaScript 15 January 2025
// Autómata de Energía - La búsqueda del equilibrio
const generaciones = parseInt(input("¿Cuántas generaciones quieres observar?"));
const WIDTH = 50;
const HEIGHT = 20;

// Crear grid inicial con valores aleatorios
function emptyGrid() {
  const grid = [];
  for (let y = 0; y < HEIGHT; y++) {
    grid[y] = [];
    for (let x = 0; x < WIDTH; x++) {
      grid[y][x] = Math.random() * 0.3;
    }
  }
  return grid;
}

// Obtener vecinos (8 direcciones)
function neighbours(grid, x, y) {
  const vals = [];
  for (let dy = -1; dy <= 1; dy++) {
    for (let dx = -1; dx <= 1; dx++) {
      if (dx === 0 && dy === 0) continue;
      const nx = x + dx;
      const ny = y + dy;
      if (nx >= 0 && nx < WIDTH && ny >= 0 && ny < HEIGHT) {
        vals.push(grid[ny][nx]);
      }
    }
  }
  return vals;
}

// Evolucionar el grid
function evolve(grid) {
  const newGrid = [];
  for (let y = 0; y < HEIGHT; y++) {
    newGrid[y] = [];
    for (let x = 0; x < WIDTH; x++) {
      let e = grid[y][x];
      const nb = neighbours(grid, x, y);
      const avg = nb.reduce((sum, val) => sum + val, 0) / nb.length;
      
      // La energía busca equilibrio con vecinos
      e = (e * 0.6) + (avg * 0.4);
      
      // Introducir pequeñas anomalías
      if (Math.random() < 0.01) {
        e += Math.random() * 0.6 - 0.3; // uniform(-0.3, 0.3)
      }
      
      // Limitar
      e = Math.max(0, Math.min(1, e));
      
      newGrid[y][x] = e;
    }
  }
  return newGrid;
}

// Renderizar grid
function render(grid) {
  const chars = " .:*O@";
  let out = "";
  for (let row of grid) {
    for (let val of row) {
      const idx = Math.floor(val * (chars.length - 1));
      out += chars[idx];
    }
    out += "\n";
  }
  return out;
}

// Mostrar estado
function mostrarEstado(gen, grid) {
  output("[CLEAR]");
  
  let outputText = `Generación ${gen}:\n`;
  outputText += `Grid: ${WIDTH}x${HEIGHT}\n`;
  outputText += `\n`;
  outputText += `Símbolos:\n`;
  outputText += `  (espacio) = energía 0.0-0.17 (muy baja)\n`;
  outputText += `  . = energía 0.17-0.33 (baja)\n`;
  outputText += `  : = energía 0.33-0.5 (media)\n`;
  outputText += `  * = energía 0.5-0.67 (alta)\n`;
  outputText += `  O = energía 0.67-0.83 (muy alta)\n`;
  outputText += `  @ = energía 0.83-1.0 (máxima)\n\n`;
  
  outputText += render(grid);
  
  output(outputText);
}

// Observador - Captura momentos peculiares
let momentosCapturados = [];
let gridAnterior = null;

// Detectar patrones interesantes
function detectarPatrones(grid) {
  const patrones = {
    variacion: 0,
    anomalias: 0,
    equilibrio: 0,
    concentracion: 0
  };
  
  let total = 0;
  let suma = 0;
  let maxVal = 0;
  let minVal = 1;
  let valoresExtremos = 0;
  
  for (let y = 0; y < HEIGHT; y++) {
    for (let x = 0; x < WIDTH; x++) {
      const val = grid[y][x];
      total++;
      suma += val;
      maxVal = Math.max(maxVal, val);
      minVal = Math.min(minVal, val);
      
      // Detectar anomalías (valores extremos)
      if (val > 0.8 || val < 0.1) {
        valoresExtremos++;
      }
    }
  }
  
  const promedio = suma / total;
  const rango = maxVal - minVal;
  
  // Calcular variación (diferencia con generación anterior)
  if (gridAnterior) {
    let diferenciaTotal = 0;
    for (let y = 0; y < HEIGHT; y++) {
      for (let x = 0; x < WIDTH; x++) {
        diferenciaTotal += Math.abs(grid[y][x] - gridAnterior[y][x]);
      }
    }
    patrones.variacion = diferenciaTotal / total;
  }
  
  patrones.anomalias = valoresExtremos / total;
  patrones.equilibrio = 1 - rango; // Menor rango = más equilibrio
  patrones.concentracion = Math.abs(promedio - 0.5); // Lejos del centro = más concentración
  
  return patrones;
}

// Capturar momento peculiar
function capturarMomento(gen, grid, patrones, razon) {
  // Guardar snapshot del grid
  const snapshot = [];
  for (let y = 0; y < HEIGHT; y++) {
    snapshot[y] = [...grid[y]];
  }
  
  momentosCapturados.push({
    generacion: gen,
    grid: snapshot,
    patrones: {
      variacion: patrones.variacion.toFixed(4),
      anomalias: patrones.anomalias.toFixed(4),
      equilibrio: patrones.equilibrio.toFixed(4),
      concentracion: patrones.concentracion.toFixed(4)
    },
    razon: razon
  });
}

// Observar y capturar momentos interesantes
function observar(gen, grid) {
  const patrones = detectarPatrones(grid);
  
  // Detectar momentos peculiares
  if (patrones.variacion > 0.15) {
    capturarMomento(gen, grid, patrones, "Alta variación - El sistema cambió bruscamente");
  } else if (patrones.anomalias > 0.1) {
    capturarMomento(gen, grid, patrones, "Muchas anomalías - Valores extremos emergieron");
  } else if (patrones.equilibrio > 0.9) {
    capturarMomento(gen, grid, patrones, "Alto equilibrio - El sistema se estabilizó");
  } else if (patrones.concentracion > 0.4) {
    capturarMomento(gen, grid, patrones, "Alta concentración - Energía se concentró");
  }
  
  // Guardar grid anterior para comparación
  gridAnterior = [];
  for (let y = 0; y < HEIGHT; y++) {
    gridAnterior[y] = [...grid[y]];
  }
}

// Mostrar momentos capturados
function mostrarMomentosCapturados() {
  if (momentosCapturados.length === 0) {
    output("\nEl observador no capturó momentos peculiares.");
    output("El sistema evolucionó de forma estable.");
    return;
  }
  
  let outputText = "\n=== MOMENTOS CAPTURADOS POR EL OBSERVADOR ===\n\n";
  
  for (let i = 0; i < momentosCapturados.length; i++) {
    const momento = momentosCapturados[i];
    outputText += `Momento ${i + 1} - Generación ${momento.generacion}:\n`;
    outputText += `Razón: ${momento.razon}\n`;
    outputText += `Variación: ${momento.patrones.variacion} | Anomalías: ${momento.patrones.anomalias}\n`;
    outputText += `Equilibrio: ${momento.patrones.equilibrio} | Concentración: ${momento.patrones.concentracion}\n\n`;
    outputText += render(momento.grid);
    outputText += "\n";
  }
  
  output(outputText);
}

// Inicializar
let grid = emptyGrid();
mostrarEstado(0, grid);
observar(0, grid);

// Evolucionar
let genActual = 0;
function evolucionar() {
  if (genActual < generaciones) {
    setTimeout(() => {
      genActual++;
      grid = evolve(grid);
      observar(genActual, grid); // Observar antes de mostrar
      mostrarEstado(genActual, grid);
      evolucionar();
    }, 10); // 50 milisegundos entre generaciones
  } else {
    setTimeout(() => {
      let finalText = "\n";
      finalText += "La energía ha evolucionado.\n";
      finalText += "Buscó equilibrio con sus vecinos.\n";
      finalText += "Las anomalías emergieron y se disiparon.\n";
      finalText += "El sistema fluyó hacia la estabilidad.\n";
      finalText += "\n";
      finalText += "El observador analizó " + generaciones + " generaciones.\n";
      finalText += "Capturó " + momentosCapturados.length + " momentos peculiares.\n";
      
      output(finalText);
      
      // Mostrar momentos capturados después de un pequeño delay
      setTimeout(() => {
        mostrarMomentosCapturados();
      }, 300);
    }, 100);
  }
}

evolucionar();

La energía busca equilibrio. Las anomalías emergen. El sistema fluye hacia la estabilidad.