Altifigence Academy

15 / 24 · Thực hành

Thực hành: kiểm tra 1024 mẫu dừng

Thử giữ, thay thế và làm trống với mọi mẫu ready mười chu kỳ.

Giữ giá trị và thứ tự khi dừng

Tạo thủ công elastic-model.mjs, lưu mã sau rồi chạy node elastic-model.mjs. Nguồn đưa ra bốn phần tử có thứ tự và chỉ tiến khi được chấp nhận. Bit 0 của mẫu điều khiển cạnh 0, bit 1 điều khiển cạnh 1, v.v. Duyệt hết 1024 mẫu ready mười bit, rồi giữ đích sẵn sàng để tháo hết công việc đang chờ.

Chuyển giao từ ô cũ trước khi quyết định phần tử thay thế. Ô trống chấp nhận một phần tử ngay cả khi đích dừng. Ô đầy đang dừng không thể làm nguồn tiến. Tăng next mỗi cạnh sẽ loại phần tử chưa được chấp nhận và làm nguồn thử nghiệm sai ngay cả khi bộ đệm đúng.

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`);

Với mẫu 0, đích dừng trong mười cạnh đầu tiên. Tag0,y0 vào ô trống tại cạnh 0 và ở đó đến cạnh 9. Cạnh 10 chuyển giao nó và lưu tag1,y9. Các thẻ 1,2,3 sau đó truyền tại cạnh 11,12,13. Không được nhầm giá trị 0 hợp lệ với null. Thành công báo 1024 mẫu và 4096 lần chuyển giao.

Số đã chấp nhận trừ số đã chuyển giao bằng số ô đang chiếm sau mỗi cạnh. Đối soát cục bộ này khoanh vùng lỗi sớm hơn việc chỉ so đầu ra cuối. Kiểm tra giữ bao quát bảo toàn tải, nhưng so với triển khai thực cần quan sát đầu ra thực của nó thay vì chỉ biến không đổi trong mô hình. Duyệt hết mẫu mười chu kỳ là kiểm tra có giới hạn, không chứng minh mọi độ dài dừng có thể xảy ra. Hoàn thành về sau còn giả định đích cuối cùng sẽ sẵn sàng; áp lực ngược vô hạn đòi hỏi bảo toàn, không bảo đảm chuyển giao.

Tự thử

Với mẫu 0, next của nguồn tiến bao xa qua cạnh 0 đến 9? Số ô chiếm và next-seen.length sau cạnh 10 là gì?

Đọc giải thích

Chỉ phần tử tại cạnh 0 được chấp nhận, nên next=1. Tại cạnh 10, tag0 truyền và tag1 vào: next=2, seen.length=1, cả hiệu và số ô chiếm đều bằng một.

Lesson files

elastic-model.mjs ↓

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.