Lập trình theo hai chiều thời gian


17

Đó 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:

Lưới 3x3 lần, kết nối bằng hành động x và y

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à +->-. 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:

Những hành động nào được đưa vào một ảnh chụp nhanh băng, như được liệt kê dưới đây

  • 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 0bởi vì mỗi +-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:

Sơ đồ với các mũi tên chỉ ra cách tính các phần của chương trình

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ột 0ô trong ô zeroth.
  • Nếu băng bắt đầu như [1] 0 0, tại thời điểm (5, 5), nó có một 0ô trong ô zeroth.

Chương trình ngắn nhất đáp ứng yêu cầu chiến thắng.


Chỉ cần để xác minh: là kết quả của hoạt động là gì +>? 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à +[], thì tại 1 2bă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 ( +[])?
John Dvorak

@JanDvorak Ah, tôi nghĩ tôi thấy những gì bạn đang hỏi. Tôi quên thêm mỗi chương trình lấy con trỏ lệnh của nó từ thời điểm liền kề theo chiều của nó. Tôi sẽ chỉnh sửa nó trong và thử chạy ( +, >) để xem liệu tôi có nhận được kết quả giống như bạn không.
Owen

Đây là một thử thách thú vị nhưng nó cần một tiêu chí chiến thắng khách quan để có thể xếp hạng các câu trả lời.
Martin Ender

3
Thử thách vẫn chưa thực sự rõ ràng với tôi. Làm thế nào chính xác thời gian tiến qua lưới điện. Theo đồ họa của bạn, có vẻ như tôi có thể đến (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 đề?
Martin Ender

Câu trả lời:


8

Tổng cộng 4 byte: ( [-],> )

Tôi đã viết một bác sĩ vũ phu để tìm chương trình nhỏ nhất như vậy.

Dưới đây là sơ đồ của chương trình này trong hành động. Các lưới này được sắp xếp theo cách tương tự với lưới trong thông số kỹ thuật, với (0,0) góc dưới bên trái, thời gian x dọc theo trục x và thời gian y dọc theo trục y. Góc trên bên phải chứa kết quả.

Đầu tiên, với một cuộn băng 0 0 0:

|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

Bây giờ với một băng 1 0 0:

|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|( 1)  0   0 |( 1)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 
|([)-]       |[(-)]       |[-(])       |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

Có một vài điều không được giải thích rõ ràng trong thông số kỹ thuật, chẳng hạn như thực tế là băng 3 ô quấn quanh.


Như một phần thưởng, đây là hình dung của ví dụ ( >+, [-]):

|( 0)  0   0 |( 0)  0   0 |( 1)  1   0 
|(>)+        |>(+)        |>+          
|[-]         |[-]         |[-(])       
+------------+------------+------------
|( 0)  0   0 |  0   0 ( 0)|  0   1 ( 1)
|(>)+        |>(+)        |>+          
|[-]         |[-]         |[(-)]       
+------------+------------+------------
|( 0)  0   0 |  0 ( 0)  0 |  0 ( 1)  0 
|(>)+        |>(+)        |>+          
|([)-]       |([)-]       |([)-]       
+------------+------------+------------

Và một trong những ví dụ ( >+, +>):

|( 1)  0   0 |  1   1 ( 0)|  1   3 ( 1)
|(>)+        |>(+)        |>+          
|+(>)        |+(>)        |+(>)        
+------------+------------+------------
|( 0)  0   0 |  0 ( 0)  0 |  0 ( 1)  0 
|(>)+        |>(+)        |>+          
|(+)>        |(+)>        |(+)>        
+------------+------------+------------

Lưu ý rằng góc trên bên phải khác với những gì bạn đã liệt kê, tôi nghĩ đây là một lỗi trong ví dụ của bạn vì mã của tôi khớp với mọi ví dụ khác mà tôi đã thử.


Thật đáng kinh ngạc! Bạn cũng có thể đúng về lỗi. Tôi sẽ kiểm tra lại.
Owen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.