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.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
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.
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.