Đó là một tai nạn hài hước rằng thế giới này chỉ có 1 chiều thời gian, nhưng nó không phải như thế. Thật dễ dàng để tưởng tượng các thế giới có 2 chiều thời gian trở lên và trong các thế giới đó, bạn có thể xây dựng máy tính và chạy phần mềm trên chúng, giống như trong thế giới này.
Hệ thống
Đây là một hệ thống để chạy các chương trình Brainf * ck theo hai chiều thời gian:
Hai kích thước thời gian là x và y. Mỗi chương trình Brainf * ck bao gồm một nửa chương trình và một nửa chương trình, ví dụ, một chương trình có thể là
x: +>+
y: [-]
Hai nửa chương trình đều có con trỏ chương trình riêng, nhưng chúng chia sẻ một con trỏ băng duy nhất (nghĩa là cả hai đều hoạt động trên cùng một ô của băng).
Thời gian là 2 chiều, vì vậy nó bao gồm một lưới các khoảnh khắc:
Di chuyển dọc theo chiều x, nửa chương trình x thực hiện một bước thời gian. Di chuyển dọc theo chiều y, nửa chương trình y thực hiện một bước.
Vì vậy, ví dụ, giả sử băng bắt đầu là [0] 0 0
( []
đại diện cho con trỏ băng) và các chương trình x / y là +
và ->-
. Việc thực hiện chương trình này sẽ như thế này:
x y tape x-action y-action
0 0 [ 0] 0 0 + at 0 - at 0
1 0 [ 1] 0 0 (done) - at 0
0 1 [-1] 0 0 + at 0 move >
1 1 [ 0] 0 0 (done) move >
Lưu ý rằng, khi thời gian di chuyển theo hướng y, chương trình x nửa tiếp tục làm điều tương tự lặp đi lặp lại, bởi vì thời gian của nó không tiến triển.
Băng tại mỗi thời điểm bao gồm hiệu ứng tích lũy của tất cả các hành động đưa vào nó (mỗi hành động được tính một lần). Vì vậy, ví dụ, băng tại thời điểm (2, 1) chứa hiệu ứng tích lũy của:
- hành động x từ (0, 0)
- hành động x từ (1, 0)
- hành động x từ (0, 1)
- hành động x từ (1, 1)
- hành động y từ (0, 0)
- hành động y từ (1, 0)
- hành động y từ (2, 0)
Phương tiện tích lũy:
- Tất cả các số tăng và giảm cho một tổng cộng.
- Tất cả các chuyển động trái (-1) và phải (+1) cho con trỏ băng tổng hợp lại với nhau.
Con trỏ chỉ dẫn không tích lũy. Mỗi nửa chương trình lấy con trỏ lệnh của nó từ thời điểm trước đó theo chiều của nó. Nghĩa là, con trỏ chương trình x chỉ tiến triển theo chiều x và con trỏ chương trình y chỉ tiến triển theo chiều y. Vì vậy, ví dụ, trong chương trình ( []
, +
) bắt đầu từ [0] 0 0
, việc thực thi sẽ là
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 0 0 0 + at 0 0 0
1 0 0 0 0 + at 0 2 (from jump) 0
0 1 1 0 0 0 1
1 1 2 0 0 1 (from NO jump) 1
Một số khoảnh khắc nữa từ mô phỏng ( +
, ->-
) ở trên là:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 + at 0 - at 0 0 0
1 0 [ 1] 0 0 - at 0 1 0
2 0 [ 1] 0 0 - at 0 1 0
0 1 [-1] 0 0 + at 0 > 0 1
1 1 [ 0] 0 0 > 1 1
2 1 [-1] 0 0 > 1 1
0 2 -1 [ 0] 0 + at 1 - at 1 0 2
1 2 0 1 [ 0] - at 2 1 2
2 2 [-1] 1 0 - at 0 1 2
Các toán tử Brainf * ck được phép là như sau (chúng có ý nghĩa tiêu chuẩn của chúng):
+
,-
: tăng, giảm;[
,]
: lặp cho đến 0 (xử lý một[
hoặc]
mất một bước thời gian, như trong Brainf * ck tiêu chuẩn);<
,>
: di chuyển sang trái / phải trên băng.
Ví dụ phức tạp
Đối với chương trình ( >
, +
) bắt đầu bằng [0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 > + at 0 0 0
1 0 0 [ 0] 0 + at 1 1 0
0 1 [ 1] 0 0 > 0 1
1 1 1 1 [ 0] 1 1
Dành cho ( +
, -
) bắt đầu bằng [0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 + at 0 - at 0 0 0
1 0 [ 1] 0 0 - at 0 1 0
0 1 [-1] 0 0 + at 0 0 1
1 1 [ 0] 0 0 1 1
Lưu ý rằng băng kết thúc như [0] 0 0
bởi vì mỗi +
và -
xảy ra hai lần, tổng bằng 0.
Đối với chương trình ( >+
, [-]
) bắt đầu bằng [0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 > 0 0
1 0 0 [ 0] 0 + at 1 1 0
2 0 0 [ 1] 0 2 0
0 1 [ 0] 0 0 > 0 3
1 1 0 0 [ 0] + at 2 1 3
2 1 0 1 [ 1] - at 2 2 1
0 2 [ 0] 0 0 > 0 3
1 2 [ 0] 0 0 + at 0 1 3
2 2 [ 1] 1 0 2 2
Sơ đồ với mũi tên
Biểu đồ dưới đây cho thấy cách tính toán các hành động và băng:
Câu đố
Viết chương trình 2D Brainf * ck (với chương trình x nửa chương trình và ay nửa chương trình) để chạy trên băng 3 ô, đáp ứng cả hai điều kiện sau:
- Nếu băng bắt đầu như
[0] 0 0
, tại thời điểm (5, 5), nó có một0
ô trong ô zeroth. - Nếu băng bắt đầu như
[1] 0 0
, tại thời điểm (5, 5), nó có một0
ô trong ô zeroth.
Chương trình ngắn nhất đáp ứng yêu cầu chiến thắng.
+
, >
) để xem liệu tôi có nhận được kết quả giống như bạn không.
(1,1)
thông qua (1,0)
hoặc (0,1)
, nhưng một chương trình bắt đầu >
và một bắt đầu với +
, thì chắc chắn thứ tự tương đối của chúng có vấn đề?
+
và>
? Nếu nó1 1 [0]
(khá điên rồ nhưng đó là những gì thông số kỹ thuật dường như gợi ý), làm thế nào để con trỏ chỉ dẫn kết hợp? Nếu hai luồng là+
và[]
, thì tại1 2
băng dữ liệu sẽ là[3]
, nhưng là con trỏ lệnh thứ hai bên trong vòng lặp ([]+
đường dẫn), hoặc bên ngoài ([+]
đường dẫn) hoặc thậm chí bất hợp pháp (+[]
)?