การเขียนโปรแกรมในสองมิติเวลา


17

มันเป็นอุบัติเหตุที่ตลกที่โลกนี้มีเพียงมิติเดียว แต่มันไม่จำเป็นต้องเป็นแบบนั้น เป็นเรื่องง่ายที่จะจินตนาการถึงโลกที่มีเวลา 2 มิติหรือมากกว่านั้นและในโลกเหล่านั้นคุณสามารถสร้างคอมพิวเตอร์และใช้งานซอฟต์แวร์กับพวกมันได้เช่นเดียวกับในโลกนี้

ระบบ

นี่คือระบบสำหรับการรันโปรแกรม Brainf * ck ในสองมิติของเวลา:

มิติเวลาสองค่าคือ x และ y โปรแกรม Brainf * ck แต่ละรายการประกอบด้วย x half-program และ ay half-program เช่นโปรแกรมอาจเป็นได้

x: +>+
y: [-]

สองโปรแกรมครึ่งแต่ละโปรแกรมมีตัวชี้โปรแกรมของตัวเอง แต่พวกเขาแชร์ตัวชี้เทปเดี่ยว (นั่นคือพวกเขาทั้งคู่ทำงานในเซลล์เดียวกันของเทป)

เวลาเป็น 2 มิติดังนั้นจึงประกอบด้วยตารางช่วงเวลา:

กริด 3x3 ครั้งการเชื่อมต่อโดย x และ y แอ็คชั่น

เมื่อเลื่อนไปตามมิติ 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) จะมี a 0อยู่ในเซลล์ zeroth
  • หากเทปเริ่มต้นตาม[1] 0 0เวลา (5, 5) จะมี a 0อยู่ในเซลล์ zeroth

โปรแกรมที่สั้นที่สุดตรงตามข้อกำหนดที่ชนะ


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

@JanDvorak อ่าฉันคิดว่าฉันเห็นสิ่งที่คุณถาม ฉันลืมที่จะเพิ่มแต่ละโปรแกรมรับตัวชี้คำแนะนำจากช่วงเวลาที่อยู่ติดกันในมิติของมัน ฉันจะแก้ไขสิ่งนั้นในและลองเรียกใช้ ( +, >) เพื่อดูว่าฉันได้ผลลัพธ์เดียวกันกับคุณหรือไม่
โอเว่น

นี่เป็นความท้าทายที่ดี แต่ต้องการเกณฑ์การชนะอย่างมีวัตถุประสงค์เพื่อให้สามารถจัดอันดับคำตอบได้
Martin Ender

3
ความท้าทายยังไม่ชัดเจนสำหรับฉัน ความคืบหน้าของเวลาผ่านกริดอย่างไร ตามกราฟิกของคุณดูเหมือนว่าฉันจะไปถึง(1,1)ผ่าน(1,0)หรืออย่างใดอย่างหนึ่ง(0,1)แต่มันเป็นหนึ่งในโปรแกรมเริ่มต้นด้วย>และหนึ่งเริ่มต้นด้วย+แล้วแน่นอนลำดับญาติของพวกเขามีความสำคัญ?
Martin Ender

คำตอบ:


8

ผลรวม 4 ไบต์: ( [-], >)

ฉันเขียนนักสืบที่โหดร้ายเพื่อค้นหาโปรแกรมที่เล็กที่สุด

นี่คือแผนภาพแสดงการทำงานของโปรแกรมนี้ กริดนี้ถูกจัดเรียงในลักษณะที่คล้ายกับกริดในสเปคโดยที่ (0,0) มุมล่างซ้าย, x-time ตามแนวแกน x, และ y-time ตามแกน y มุมบนขวามีผลลัพธ์

ก่อนด้วยเทป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 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

ตอนนี้ด้วยเทปของ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 
|([)-]       |[(-)]       |[-(])       |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

มีบางสิ่งที่ไม่ได้อธิบายอย่างชัดเจนในสเป็คเช่นข้อเท็จจริงที่ว่าเทป 3 เซลล์ล้อมรอบ


ในฐานะโบนัสนี่คือการแสดงตัวอย่าง( >+, [-]) ตัวอย่าง:

|( 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 
|(>)+        |>(+)        |>+          
|([)-]       |([)-]       |([)-]       
+------------+------------+------------

และหนึ่งในตัวอย่าง( >+, +>):

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

โปรดทราบว่ามุมขวาบนนั้นแตกต่างจากที่คุณระบุไว้ฉันคิดว่านี่เป็นข้อผิดพลาดในตัวอย่างของคุณเพราะรหัสของฉันตรงกับตัวอย่างอื่น ๆ ที่ฉันได้ลอง


นี่มันอัศจรรย์มาก! คุณอาจถูกต้องเกี่ยวกับข้อผิดพลาด ฉันจะตรวจสอบอีกครั้ง
โอเว่น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.