$p=$a[$p]+=$_ for@F;redo
इसे ऑनलाइन आज़माएं! (इसमें एक हेडर होता है जो आंतरिक स्थिति को प्रिंट करता है और 10 पुनरावृत्तियों के बाद रुकता है, ताकि व्यवहार अवलोकन योग्य हो)
भाषा के बारे में
मैंने I / D मशीन पर काम करते हुए पिछले कुछ दिनों को बिताया है , बहुत ही सरल प्रोग्रामिंग भाषाओं के लिए मेरे नवीनतम विचारों में से एक। यह निम्नानुसार काम करता है: डेटा स्टोरेज में एक अनबाउंड रैम, शुरू में सभी शून्य होते हैं। प्रत्येक तत्व एक अनबाउंड पूर्णांक संग्रहीत कर सकता है (हालांकि व्यवहार में, अधिकांश I / D मशीन प्रोग्राम केवल उनमें से अधिकांश में छोटे पूर्णांक संग्रहीत करेंगे, और केवल बड़े पते वाले कक्षों को संबोधित करने के तरीके के रूप में अनबाउंड पूर्णांक का उपयोग करते हैं)। एक डेटा पॉइंटर भी है, जो एक सेल को इंगित करता है (यानी एक सेल के रूप में पता रखता है); यह शुरू में शून्य भी है।
केवल दो आदेश हैं:
I
: सेल डेटा सूचक को बढ़ाता है। (डेटा पॉइंटर ही अपरिवर्तित रहता है।)
D
: डेटा पॉइंटर को डिरेल करें, अर्थात उस सेल के मान को पढ़ें जो डेटा पॉइंटर को इंगित करता है। फिर परिणामी मूल्य को संग्रहीत करें जिसे आप डेटा पॉइंटर में वापस पढ़ते हैं।
निष्पादन बस प्रोग्राम को एक लूप में बार-बार, हमेशा के लिए चलाता है।
यह काफी आश्चर्यजनक है कि यह सरल भाषा ट्यूरिंग-पूर्ण है, इसलिए मैं यह साबित करने पर काम कर रहा हूं। यहाँ सबूत है । यह थ्री स्टार प्रोग्रामर के लिए (लेकिन इससे भी सरल) प्रमाण के समान है, एक बहुत ही समान भाषा है (और वास्तव में, यह सबमिशन प्रोग्राम के चारों ओर एक ही मूल OISC "शेल" का उपयोग करता है, केवल वास्तविक निर्देशन में भिन्न होता है)।
कार्यक्रम के बारे में
प्रयोग
इनपुट को मानक इनपुट पर दिया जाना चाहिए, और टिप्पणियों के बिना एक I / D मशीन प्रोग्राम है, और RLE / OISC सिंटैक्स का उपयोग कर रहा है। (I / D मशीन में दो अलग-अलग, समान वाक्यविन्यास हैं, लेकिन गोल्फ के लिए यह कार्यक्रम केवल उनमें से एक का समर्थन करता है।) इस वाक्यविन्यास में, एक प्रोग्राम दशमलव में संख्याओं का एक क्रम है, I
जो D
कमांड के बीच कमांडों की लंबाई का प्रतिनिधित्व करता है । (आप उनके बीच D
"रन ऑफ़ 0 I
कमांड" रखकर दो या अधिक लगातार कमांड निर्दिष्ट कर सकते हैं , इसलिए वाक्यविन्यास पूरी तरह से सामान्य है।)
व्याख्या
कार्यक्रम से देखा जा सकता है, इस को लागू नहीं किया गया है I
और D
आदेशों को व्यक्तिगत रूप से। वास्तव में, यह एक (बहुत थोड़ा) दुभाषिया का अनुकूलन है (विशुद्ध रूप से क्योंकि यह इस तरह से लिखना छोटा है)। यह देखना है कि एन इंक्रीमेंट कमांड का एक रन डेटा पॉइंटर के टारगेट को एन बार बढ़ाता है , यानी इसमें एन जोड़ें ; और 0 इंक्रीमेंट कमांड का रन भी इस तरह से लागू किया जा सकता है, क्योंकि 0 को मेमोरी में जोड़ने से कोई प्रभाव नहीं पड़ता है। इसलिए जो ऑपरेशन हम वास्तव में कार्यान्वित करते हैं वह एक रन-इन I
और ए को लागू करने के बीच वैकल्पिक करना है D
। या दूसरे शब्दों में, " एन जोड़ेंडेटा पॉइंटर द्वारा इंगित मूल्य (डेटा पॉइंटर द्वारा इंगित मूल्य में इसे वापस संग्रहीत करना), फिर डेटा पॉइंटर द्वारा इंगित मूल्य को पढ़ें और इसे डेटा पॉइंटर में संग्रहीत करें "। यह स्पष्ट रूप से इसके मुकाबले अधिक क्रिया है। होने के लिए, और हम इसे " डेटा पॉइंटर द्वारा इंगित मूल्य में n को जोड़ने के लिए आगे सरलीकृत कर सकते हैं , फिर उस मूल्य को डेटा पॉइंटर के लक्ष्य और स्वयं डेटा पॉइंटर दोनों में संग्रहीत कर सकते हैं"।
तो यह हमारे कार्यक्रम के मूल के लिए बनाता है। हम $a
रैम को स्टोर करने के लिए एक सरणी का उपयोग कर रहे हैं , और $p
डेटा पॉइंटर के रूप में (सरणी में अनुक्रमण कर रहे हैं):
$p=$a[$p]+=$_
+ $_ add {the run length}
$a[$p] to the element of $a pointed to by $p
$a[$p] = storing the result back into that element
$p= and also in the pointer itself
आसानी से, पर्ल असमान रूप से सरणी तत्वों की व्याख्या करते हैं, जब वे संख्याओं की तरह व्यवहार किए जाते हैं, इसलिए सरणी को हमारे लिए ज़ीरो के लिए किसी भी स्पष्ट कोड के बिना प्रारंभिक रूप से आरंभ किया जाएगा। (एक संभावित मुद्दा संख्यात्मक सटीकता है जब संख्याएं बड़ी हो जाती हैं; हालांकि, यह केवल तभी होगा जब उपयोग की जा रही सरणी की मात्रा मशीन के पता स्थान से अधिक हो जाती है (पर्ल पूर्णांक बिंदुओं को पकड़ने के लिए काफी बड़े होते हैं), ऐसा कुछ नहीं हो सकता है एक आदर्श मशीन पर।)
अंत में, हमें यह करने की आवश्यकता है कि इस कार्यक्रम को दो छोरों में रखा जाए। for@F
पाश, के साथ संयुक्त -a
कमांड लाइन विकल्प, मानक इनपुट के क्षेत्र से अधिक इच्छा लूप ( "क्षेत्र" के डिफ़ॉल्ट परिभाषा यहाँ खाली स्थान के पर विभाजित होगा)। redo
पाश एक अंतर्निहित पाश में पूरे कार्यक्रम (अलावा अन्य, आसानी से, मानक इनपुट के पढ़ने) स्थापित करेंगे, जो के रूप में मैं / डी मशीन के शब्दों के लिए आवश्यक कार्यक्रम बार-बार एक पाश में चलाने के लिए, कारण होगा।
eval
-समान समाधानों को रोकने के लिए ।