दो समय आयामों में प्रोग्रामिंग


17

यह एक अजीब दुर्घटना है कि इस दुनिया में सिर्फ 1 समय का आयाम होता है, लेकिन ऐसा नहीं होना चाहिए। 2 या अधिक समय आयामों के साथ दुनिया की कल्पना करना आसान है, और उन दुनिया में आप कंप्यूटर बना सकते हैं और उन पर सॉफ़्टवेयर चला सकते हैं, जैसे इस एक में।

प्रणाली

यहाँ दो समय आयामों में ब्रेनफ * ck प्रोग्राम चलाने की प्रणाली है:

दो समय आयाम x और y हैं। प्रत्येक ब्रेनफ * ck प्रोग्राम में एक एक्स हाफ प्रोग्राम होता है, और एक हाफ प्रोग्राम, जैसे, एक प्रोग्राम हो सकता है

x: +>+
y: [-]

दो आधे कार्यक्रमों में से प्रत्येक का अपना प्रोग्राम पॉइंटर होता है, लेकिन वे एक ही टेप पॉइंटर को साझा करते हैं (अर्थात, वे दोनों टेप के एक ही सेल पर काम करते हैं)।

समय 2-आयामी है, इसलिए इसमें क्षणों का ग्रिड शामिल है:

एक्स और वाई कार्यों द्वारा समय की एक 3x3 ग्रिड, कनेक्शन

एक्स आयाम के साथ आगे बढ़ते हुए, एक्स हाफ-प्रोग्राम एक समय कदम को कार्यान्वित करता है। 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) में संचयी प्रभाव होता है:

नीचे बताए अनुसार, कौन सी क्रियाएं टेप स्नैपशॉट में फीड होती हैं

  • (0, 0) से एक्स-एक्शन
  • (1, 0) से एक्स-एक्शन
  • (0, 1) से एक्स-एक्शन
  • (1, 1) से एक्स-एक्शन
  • y- एक्शन से (0, 0)
  • (ए, 0 से)
  • y- एक्शन से (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 ऑपरेटरों को निम्नलिखित की अनुमति है (उनके मानक अर्थ हैं):

  • +, -: वेतन वृद्धि, घटती;
  • [, ]: शून्य तक लूप (एक प्रसंस्करण [या ]मानक Brainf * सी.के. में के रूप में एक बार कदम लेता है,);
  • <, >: चाल छोड़ दिया / सही टेप पर।

जटिल उदाहरण

कार्यक्रम के लिए ( >, +) के साथ शुरू [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

तीर के साथ आरेख

नीचे दिए गए आरेख से पता चलता है कि कार्यों और टेप की गणना कैसे करें:

कार्यक्रम के कुछ हिस्सों की गणना करने वाले तीर के साथ आरेख

पहेली

3-सेल टेप पर चलने के लिए एक 2D ब्रेनफ * ck प्रोग्राम (एक एक्स हाफ प्रोग्राम और ay आधा प्रोग्राम के साथ) लिखें, जो निम्नलिखित दोनों स्थितियों को पूरा करता है:

  • यदि टेप शुरू होता है [0] 0 0, समय पर (5, 5) यह 0शून्य सेल में है।
  • यदि टेप शुरू होता है [1] 0 0, समय पर (5, 5) यह 0शून्य सेल में है।

आवश्यकताओं को पूरा करने वाला सबसे छोटा कार्यक्रम जीतता है।


बस सत्यापित करने के लिए: क्या चल रहा है +और >? यदि यह 1 1 [0](बहुत पागल है, लेकिन यह सुझाव देने के लिए लगता है कि क्या है), अनुदेश संकेत कैसे गठबंधन करते हैं? यदि दो धागे हैं +और [], तो 1 2डेटा टेप पर होगा [3], लेकिन क्या लूप ( []+पथ), या बाहर ( [+]पथ) या यहां तक ​​कि अवैध ( +[]) के अंदर दूसरा अनुदेश सूचक है ?
जॉन ड्वोरक

@JDDvorak आह, मुझे लगता है कि मैं देख रहा हूं कि आप क्या पूछ रहे हैं। मैं प्रत्येक कार्यक्रम को जोड़ना भूल गया, इसके निर्देश सूचक को इसके आयाम में आसन्न क्षण से प्राप्त करता है। मुझे लगता है कि में संपादित करें, और (चलाने की कोशिश करता हूँ +, >) अगर मैं आप के रूप में एक ही परिणाम प्राप्त देखने के लिए।
ओवेन

यह एक अच्छी चुनौती है, लेकिन इसे उत्तर देने में सक्षम होने के लिए एक उद्देश्य जीतने वाली कसौटी की जरूरत है।
मार्टिन एंडर

3
चुनौती अभी भी मेरे लिए स्पष्ट नहीं है। ग्रिड के माध्यम से समय की प्रगति कैसे होती है। आपके ग्राफिक के अनुसार ऐसा लगता है कि मैं या (1,1)तो इसके माध्यम से पहुंच सकता हूं , लेकिन यह एक कार्यक्रम के साथ शुरू होता है और एक के साथ शुरू होता है , तो निश्चित रूप से उनके सापेक्ष क्रम मायने रखता है? (1,0)(0,1)>+
मार्टिन एंडर

जवाबों:


8

4 बाइट्स कुल: ( [-], >)

मैंने इस तरह के सबसे छोटे प्रोग्राम को खोजने के लिए एक ब्रूट-फोरसर लिखा

कार्रवाई में इस कार्यक्रम के चित्र यहां दिए गए हैं। इस ग्रिड को कल्पना में ग्रिड के समान तरीके से व्यवस्थित किया जाता है, (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)  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 
|(>)+        |>(+)        |>+          
|(+)>        |(+)>        |(+)>        
+------------+------------+------------

ध्यान दें कि ऊपरी-दाएं कोने आपके द्वारा सूचीबद्ध किए गए से अलग है, मुझे लगता है कि यह आपके उदाहरण में एक त्रुटि है क्योंकि मेरा कोड आपके द्वारा की गई कोशिशों से मेल खाता है।


ये अद्भुत है! आप अच्छी तरह से त्रुटि के बारे में सही हो सकते हैं। मैं फिर से इसकी जांच करूंगा।
ओवेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.