Altifigence Academy

15 / 24 · Práctica

Práctica: comprueba 1024 patrones de detención

Ejercita la conservación, el reemplazo y el vaciado con todos los patrones ready de diez ciclos.

Conserva los valores y el orden con detenciones

Crea manualmente elastic-model.mjs, guarda el código siguiente y ejecuta node elastic-model.mjs. El productor ofrece cuatro elementos ordenados y solo avanza cuando se aceptan. El bit cero del patrón controla el flanco 0, el bit uno controla el flanco 1, y así sucesivamente. Recorre los 1024 patrones ready de diez bits y después mantén listo el receptor para drenar el trabajo pendiente.

Entrega desde la posición anterior antes de decidir el reemplazo. Una posición vacía acepta un elemento incluso con el receptor detenido. Una posición llena y detenida no puede hacer avanzar al productor. Incrementar next en cada flanco descartaría los elementos no aceptados y haría incorrecto el productor de prueba aunque el búfer fuera correcto.

javascript
import assert from 'node:assert/strict';
const values = [0, 9, 255, 12];
let deliveries = 0;
for (let pattern = 0; pattern < 1024; pattern++) {
  let slot = null, next = 0;
  const seen = [];
  for (let edge = 0; edge < 20; edge++) {
    const ready = edge >= 10 || ((pattern >>> edge) & 1) === 1;
    const old = slot;
    const inReady = old === null || ready;
    if (old !== null && ready) seen.push(old);
    if (inReady) {
      slot = next < values.length ? { tag: next, y: values[next] } : null;
      if (slot !== null) next++;
    } else {
      assert.deepEqual(slot, old);
    }
    assert.equal(next - seen.length, Number(slot !== null));
  }
  assert.deepEqual(seen, values.map((y, tag) => ({ tag, y })));
  assert.equal(slot, null);
  deliveries += seen.length;
}
console.log(`ELASTIC PASS: 1024 patterns, ${deliveries} deliveries`);

Para el patrón cero, el receptor se detiene durante los diez primeros flancos. Tag0,y0 entra en la posición vacía en el flanco 0 y permanece allí hasta el flanco 9. El flanco 10 lo entrega y almacena tag1,y9. Las etiquetas 1,2,3 se transfieren después en los flancos 11,12,13. Un cero válido no debe confundirse con null. La ejecución correcta informa de 1024 patrones y 4096 entregas.

Aceptadas menos entregadas es igual a la ocupación actual después de cada flanco. Esta contabilidad local delimita los fallos antes que una comparación final de salidas. Las comprobaciones de conservación cubren la preservación de la carga útil, aunque comparar una implementación real requiere observar su salida real en lugar de solo la variable sin cambios de este modelo. Recorrer exhaustivamente patrones de diez ciclos es una prueba acotada, no una demostración para todas las longitudes posibles de detención. La finalización eventual supone además que el receptor acaba estando listo; la contrapresión indefinida exige conservación, no entrega garantizada.

Inténtalo tú

Para el patrón cero, ¿cuánto avanza next del productor entre los flancos 0 y 9? ¿Cuáles son la ocupación y next-seen.length después del flanco 10?

Leer la explicación

Solo se acepta el elemento del flanco 0, así que next=1. En el flanco 10, tag0 se transfiere y entra tag1: next=2, seen.length=1 y tanto la diferencia como la ocupación de la posición valen uno.

Lesson files

elastic-model.mjs ↓

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.