มันเป็นอุบัติเหตุที่ตลกที่โลกนี้มีเพียงมิติเดียว แต่มันไม่จำเป็นต้องเป็นแบบนั้น เป็นเรื่องง่ายที่จะจินตนาการถึงโลกที่มีเวลา 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]แต่ตัวชี้คำสั่งที่สองภายในลูป ([]+พา ธ ) หรือภายนอก ([+]พา ธ ) หรือแม้แต่ผิดกฎหมาย (+[])?