Đây là một sự phát triển hơn nữa của câu trả lời của @ ais523 , giảm nó xuống chỉ còn hai bộ dấu ngoặc và cũng sử dụng vị trí ô nhỏ gọn hơn dựa trên lý thuyết thước kẻ Golomb. ais523 đã tạo một trình biên dịch cho cấu trúc này , cũng như phiên TIO này hiển thị một chương trình mẫu kết quả BF đang chạy với theo dõi gỡ lỗi của các bộ đếm TWM.
Giống như bản gốc, điều này bắt đầu với một chương trình trong Mô hình thác nước , với một số hạn chế không làm mất tính tổng quát:
- Tất cả các bộ đếm có cùng giá trị tự đặt lại R ; nghĩa là, bản đồ kích hoạt TWM f có thuộc tính f(x,x)=R với mọi x .
- Có một bộ đếm tạm dừng h .
- Số c của bộ đếm là (p−1)/2 cho một số số nguyên tố p .
Thước kẻ Golomb
Chúng tôi kết hợp cấu trúc Erdős Gian Turán với chức năng hoán vị của một mảng Welas của Costas để có được một thước kẻ Golomb với các thuộc tính cần thiết.
(Tôi chắc chắn rằng việc xây dựng kết hợp này không thể là một ý tưởng mới nhưng chúng tôi chỉ tìm thấy và kết hợp hai phần này từ Wikipedia.)
Đặt r là gốc nguyên thủy của p=2c+1 . Xác định hàm
g(k)=4ck−((rk−1)mod(2c+1)),k=0,…,2c−1.
- g là mộtngười cai trị Golombtheo thứ tự2c . Nghĩa là, sự khác biệtg(i)−g(j) là duy nhất cho mỗi cặp số riêng biệti,j∈{0,…,2c−1} .
- g(k)mod(2c) nhận mọi giá trị0,…,2c−1 chính xác một lần.
Cấu trúc băng
Với mỗi bộ đếm TWM x∈{0,…,c−1} , chúng tôi gán hai vị trí ô băng BF, một ô dự phòng u(x) và một ô giá trị v(x) :
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
Theo thuộc tính thứ hai của có chính xác hai giá trị riêng biệt để chọn.gk1,k2
Nội dung của một tế bào dự phòng hầu hết thời gian sẽ được giữ ở mức , ngoại trừ khi bộ đếm của nó vừa được truy cập, khi đó nó sẽ ở mức , gấp đôi giá trị tự đặt lại của bộ đếm. Một ô giá trị sẽ được giữ ở mức gấp đôi giá trị của bộ đếm TWM tương ứng.02R
Tất cả các ô khác có thể đạt được bằng cách thực hiện chương trình BF (một số hữu hạn) sẽ được giữ ở các giá trị lẻ, để chúng luôn kiểm tra là khác không. Sau khi khởi tạo, điều này là tự động vì tất cả các điều chỉnh ô đều bằng số lượng chẵn.
Nếu muốn, tất cả các vị trí ô có thể được dịch chuyển sang phải bởi một hằng số để tránh di chuyển sang bên trái của vị trí băng BF ban đầu.
Cấu trúc chương trình BF
Đặt là khoảng cách giữa giá trị của bộ đếm tạm dừng và các ô dự phòng và để là một số đủ lớn để cho tất cả các quầy x . Sau đó, cấu trúc chương trình BF cơ bản làH=v(h)−u(h)NcN+1≥v((x+1)modc)−u(x)x
khởi tạo [
>
×(H+cN+1) [
<
×c ]
điều chỉnh <
×H ]
Khởi tạo
Các khởi giai đoạn tập hợp tất cả các tế bào có thể truy cập bởi các chương trình với các giá trị ban đầu của họ, trong một trạng thái như thể truy cập cuối cùng vừa được truy cập và các tế bào chỉ hoạt động là tế bào dự phòng của nó u(c−1) :
- Các ô giá trị được khởi tạo thành hai lần nội dung ban đầu của bộ đếm TWM tương ứng, ngoại trừ bộ đếm 0 được giảm trước.
- Tế bào dự phòng được thiết lập để 0 , ngoại trừ tế bào u(c−1) , được thiết lập để 2R .
- Tất cả các ô khác có thể truy cập theo chương trình (một số hữu hạn) được đặt thành 1 .
Sau đó, con trỏ băng được di chuyển đến vị trí u(c−1)−H (một ô luôn luôn khác không) trước khi chúng ta đến chương trình đầu tiên [
.
Bắt đầu vòng lặp bên ngoài
Khi bắt đầu một vòng lặp của vòng lặp bên ngoài, con trỏ băng sẽ ở một trong hai u(x)−H hoặc v(x)−H cho một bộ đếm x .
Đặt y=((x+1)modc) làm bộ đếm tiếp theo ghé thăm.
Chuyển động >
×(H+cN+1) đặt con trỏ băng lên vị trí ≡y(modc) và không ở bên trái củav(y) .
Vòng lặp bên trong [
<
×c ]
bây giờ tìm kiếm bên trái theo các bước của c cho một ô không. Nếu bộ đếm y bằng 0, thì nó sẽ dừng ở ô giá trị (không) v(y) ; nếu không nó sẽ tìm thấy ô dự phòng u(y) .
Bất kỳ ô nào được tìm thấy sẽ trở thành ô hoạt động mới .
Điều chỉnh
Các điều chỉnh giai đoạn điều chỉnh tế bào khác nhau trên băng dựa trên vị trí của họ so với các tế bào hoạt động. Phần này chỉ chứa +-><
các lệnh và vì vậy những điều chỉnh này xảy ra vô điều kiện. Tuy nhiên, vì tất cả các ô liên quan đến bộ đếm đều nằm trong mẫu thước kẻ Golomb, nên mọi điều chỉnh không phù hợp với ô hiện hoạt sẽ bỏ lỡ tất cả các ô quan trọng và thay vào đó điều chỉnh một số ô không liên quan (trong khi vẫn giữ nguyên số lẻ).
Do đó, mã riêng biệt phải được đưa vào chương trình cho từng cặp ô hoạt động và điều chỉnh cần thiết có thể, ngoại trừ việc tự điều chỉnh của một ô đang hoạt động, bởi vì điều chỉnh chỉ dựa trên vị trí tương đối, phải được chia sẻ giữa tất cả chúng.
Các điều chỉnh cần thiết là:
- Điều chỉnh tế bào fallback quầy trước u(x) bởi −2R .
- Điều chỉnh ô dự phòng của bộ đếm hiện tại u(y) bằng 2R , trừ khi ô hiện hoạt là v(h) và vì vậy chúng ta nên tạm dừng.
- Điều chỉnh ô giá trị của bộ đếm tiếp theo v((y+1)modc) bằng −2 (giảm bộ đếm).
- Khi ô hiện hoạt là ô giá trị v(y) (vì vậy bộ đếm y đã đạt đến 0), điều chỉnh tất cả các ô giá trị v(z) bằng 2f(y,z) từ bản đồ kích hoạt TWM. v(y) bản thân trở nên điều chỉnh bằng 2R .
Các điều chỉnh thứ nhất và thứ hai ở trên được thực hiện cần thiết bởi thực tế là tất cả các ô đang hoạt động phải tự điều chỉnh theo cùng một giá trị, đó là 2R cho các ô giá trị và do đó cũng cho các ô dự phòng. Điều này đòi hỏi phải chuẩn bị và dọn sạch các ô dự phòng để đảm bảo chúng trở về 0 trong cả hai nhánh giá trị và dự phòng.
Kết thúc vòng ngoài
Chuyển động <
×H biểu thị rằng ở cuối giai đoạn điều chỉnh, con trỏ băng được di chuyển H sang bên trái của ô đang hoạt động.
Đối với tất cả các ô hoạt động khác với ô giá trị của bộ đếm tạm dừng v(h) , đây là một ô không liên quan, do đó, lẻ và khác không, và vòng lặp bên ngoài tiếp tục cho một lần lặp khác.
Đối với v(h) , con trỏ thay vào đó được đặt trên ô dự phòng tương ứng u(h) , mà chúng ta đã tạo một ngoại lệ ở trên để giữ cho nó bằng không, và do đó chương trình thoát qua cuối cùng ]
và dừng lại.