มันเป็นอุบัติเหตุที่ตลกที่โลกนี้มีเพียงมิติเดียว แต่มันไม่จำเป็นต้องเป็นแบบนั้น เป็นเรื่องง่ายที่จะจินตนาการถึงโลกที่มีเวลา 2 มิติหรือมากกว่านั้นและในโลกเหล่านั้นคุณสามารถสร้างคอมพิวเตอร์และใช้งานซอฟต์แวร์กับพวกมันได้เช่นเดียวกับในโลกนี้
ระบบ
นี่คือระบบสำหรับการรันโปรแกรม Brainf * ck ในสองมิติของเวลา:
มิติเวลาสองค่าคือ x และ y โปรแกรม Brainf * ck แต่ละรายการประกอบด้วย x half-program และ ay half-program เช่นโปรแกรมอาจเป็นได้
x: +>+
y: [-]
สองโปรแกรมครึ่งแต่ละโปรแกรมมีตัวชี้โปรแกรมของตัวเอง แต่พวกเขาแชร์ตัวชี้เทปเดี่ยว (นั่นคือพวกเขาทั้งคู่ทำงานในเซลล์เดียวกันของเทป)
เวลาเป็น 2 มิติดังนั้นจึงประกอบด้วยตารางช่วงเวลา:
เมื่อเลื่อนไปตามมิติ x โปรแกรมครึ่ง x จะดำเนินการในขั้นตอนเดียว เมื่อเลื่อนไปตามมิติ y โปรแกรมครึ่ง y จะดำเนินการในขั้นตอนเดียว
ดังนั้นสำหรับตัวอย่างเช่นสมมติว่าเทปเริ่มออกเป็น[0] 0 0( []หมายถึงตัวชี้เทป) และ x / 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 >
ขอให้สังเกตว่าเมื่อเวลาเคลื่อนไปในทิศทาง y โปรแกรม x ครึ่งยังคงทำสิ่งเดียวกันซ้ำไปซ้ำมาเพราะเวลาไม่คืบหน้า
เทปในแต่ละช่วงเวลารวมถึงผลกระทบสะสมของการกระทำทั้งหมดที่ฟีดเข้าไป (แต่ละการกระทำนับครั้งเดียว) ตัวอย่างเช่นเทปที่เวลา (2, 1) มีผลสะสมของ:
- การกระทำ x จาก (0, 0)
- การกระทำ x จาก (1, 0)
- การกระทำ x จาก (0, 1)
- การกระทำ x จาก (1, 1)
- y-action จาก (0, 0)
- y-action จาก (1, 0)
- y-action จาก (2, 0)
วิธีการสะสม:
- การเพิ่มและการลดลงทั้งหมดของผลรวมเซลล์ด้วยกัน
- การเคลื่อนไหวทางซ้ายทั้งหมด (-1) และขวา (+1) ไปยังผลรวมของตัวชี้เทปเข้าด้วยกัน
พอยน์เตอร์การเรียนการสอนไม่สะสม แต่ละโปรแกรมครึ่งได้รับตัวชี้คำแนะนำจากช่วงเวลาก่อนหน้าในมิติของมัน นั่นคือพอยน์เตอร์ของโปรแกรม x คืบหน้าเฉพาะในมิติ x และพอยน์เตอร์ของโปรแกรม y คืบหน้าเฉพาะในมิติ y ตัวอย่างเช่นในโปรแกรม ( [], +) เริ่มต้นจาก[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 0    2 (from jump)     0
0 1  1 0 0                      0                 1
1 1  2 0 0                      1 (from NO jump)  1
บางช่วงเวลาเพิ่มเติมจากการจำลองข้างต้น ( +, ->-) คือ:
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
ตัวดำเนินการ Brainf * ck ที่อนุญาตมีดังต่อไปนี้ (มีความหมายมาตรฐาน):
- +,- -: เพิ่มขึ้น, ลดลง;
- [,- ]: วนซ้ำจนกระทั่งเป็นศูนย์ (การประมวลผล a- [หรือ- ]ใช้เวลาหนึ่งขั้นตอนดังเช่นใน Brainf * ck มาตรฐาน);
- <,- >: เลื่อนไปทางซ้าย / ขวาบนเทป
ตัวอย่างที่ซับซ้อน
สำหรับโปรแกรม ( >, +) เริ่มต้นด้วย[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
สำหรับ ( +, -) เริ่มต้นด้วย[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
โปรดทราบว่าเทปจะสิ้นสุดลง[0] 0 0เนื่องจากแต่ละครั้ง+และ-เกิดขึ้นสองครั้งรวมเป็น 0
สำหรับโปรแกรม ( >+, [-]) เริ่มต้นด้วย[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
ไดอะแกรมที่มีลูกศร
แผนภาพด้านล่างแสดงวิธีการคำนวณการกระทำและเทป:
ปริศนา
เขียนโปรแกรม 2D Brainf * ck (ด้วย x half-program และ ay half-program) เพื่อเรียกใช้บนเทป 3 เซลล์ซึ่งเป็นไปตามเงื่อนไขต่อไปนี้:
- หากเทปเริ่มต้นตาม[0] 0 0เวลา (5, 5) จะมี a0อยู่ในเซลล์ zeroth
- หากเทปเริ่มต้นตาม[1] 0 0เวลา (5, 5) จะมี a0อยู่ในเซลล์ zeroth
โปรแกรมที่สั้นที่สุดตรงตามข้อกำหนดที่ชนะ
+, >) เพื่อดูว่าฉันได้ผลลัพธ์เดียวกันกับคุณหรือไม่
                (1,1)ผ่าน(1,0)หรืออย่างใดอย่างหนึ่ง(0,1)แต่มันเป็นหนึ่งในโปรแกรมเริ่มต้นด้วย>และหนึ่งเริ่มต้นด้วย+แล้วแน่นอนลำดับญาติของพวกเขามีความสำคัญ?
                


+และ>? ถ้ามัน1 1 [0]( มันค่อนข้างบ้า แต่มันเป็นสเป็คที่แนะนำ), พอยน์เตอร์การเรียนการสอนรวมกันได้อย่างไร? หากเธรดทั้งสองเป็น+และ[]จากนั้น1 2เทปข้อมูลจะเป็น[3]แต่ตัวชี้คำสั่งที่สองภายในลูป ([]+พา ธ ) หรือภายนอก ([+]พา ธ ) หรือแม้แต่ผิดกฎหมาย (+[])?