जवाबों:
*
आउटपुट के लिए उपयोग करेंक्योंकि आप स्टैक पर एक स्ट्रिंग को छोड़ कर आउटपुट कर सकते हैं, इसलिए आउटपुट के*
बजाय इसका उपयोग करके स्ट्रिंग को संचय करने के लिए उपयोगी हो सकता है S
। कहते हैं कि आपकी चुनौती थी "एक तार ले लो और एक अंतरिक्ष को जोड़ दें", इसे आउटपुट के साथ करने का तरीका होगा:
S( )S
*
दूसरी ओर, इसके साथ करने का तरीका एक बाइट छोटा है:
( )*
समस्या यह है कि यदि आपके आउटपुट में बहुत अधिक संचय है, तो स्टैक पर आउटपुट तत्व से निपटने के लिए बाइट का खर्च हो सकता है।
यदि आपको कोड के एक टुकड़े का उपयोग करने की आवश्यकता है, तो यह उस कोड को स्टैक पर संग्रहीत करने और प्रत्येक और फिर इसे डुप्लिकेट-और-निकालने के लिए समझ में आता है। अब तक, यह सिर्फ सामान्य अंडरलोड प्रोग्रामिंग है। दुर्भाग्य से, स्टैक पर लंबे समय के लिए एक मूल्य रखना मुश्किल है और आपके कोड को वर्बोज़ बनने का कारण बनता है, और यह तब भी सच है जब मान डेटा के बजाय एक फ़ंक्शन है। यदि आपके कई कार्य हैं जिन्हें बार-बार पुन: उपयोग करने की आवश्यकता है तो यह बहुत बुरा हो जाता है।
बड़े कार्यक्रमों के प्रकार में, जो कई पुन: उपयोग किए जाने वाले कार्यों से लाभान्वित हो सकते हैं, एक समाधान जिसका आप उपयोग कर सकते हैं, इसके बजाय एक बड़ा कार्य करना है जो उनके किसी भी उद्देश्य को पूरा कर सकता है जिस तरह से यह कहा जाता है (या तो स्टैक पर इसके नीचे क्या है, इसके आधार पर, या उससे अधिक समय का उपयोग कर बस से दृश्यों बुला के माध्यम से ^
, एक सावधानी से लिखा समारोह भेद कर सकते हैं ^^
से ^:^
से ^*^
से ^~^
, आप चार अलग, काफी कम दृश्यों दे रही है)। आप अन्य उपयोगी चीजों को भी स्टोर कर सकते हैं, जैसे कि स्ट्रिंग्स जो आप कई बार उपयोग करते हैं, इस "शब्दकोश" में। ध्यान दें कि यदि आप डिक्शनरी का भारी उपयोग करते हैं, तो इसे एक प्रकार की क्वीन बनाने के लिए समझ में आ सकता है, स्टैक पर खुद की कॉपी को पीछे धकेलना, ताकि आपको इसे मैन्युअल रूप से कॉपी करने की आवश्यकता न हो:
भविष्य में इसका उपयोग करने की क्षमता खोए बिना इसका उपयोग करने में सक्षम होना।
^!!!!^
शैली देखने (जो मैं भी पृष्ठ पर कई अन्य उदाहरण में उपयोग किया है, विशेष रूप से न्यूनतम अनुभाग में।) हालांकि कि कम से कम देखने नहीं दे सकता है।
एक सरल उदाहरण के रूप में, बूलियन्स का सबसे अधिक देखा जाने वाला कार्यान्वयन !()
गलत (यानी पूर्णांक 0) के लिए है, और सही (यानी पूर्णांक 1) के लिए अशक्त स्ट्रिंग है, लेकिन यदि आपके पास एक समस्या है जो तार्किक XOR के आसपास बहुत अधिक आधारित है, तो यह अधिक हो सकती है असत्य के लिए अशक्त स्ट्रिंग का उपयोग करने का अर्थ है, और ~
सच के लिए (यह डेटा प्रारूप का उपयोग करके किसी भी अन्य बूलियन प्रारूप में परिवर्तित किया जा सकता है (false)~(true)~^!
, और *
XOR के लिए बहुत ही प्रतिकूल कार्यान्वयन की अनुमति देता है ।
इस सामान्य सिद्धांत को और भी आगे ले जाना और उन कार्यों का उपयोग करना संभव है जिन्हें आपके डेटा मूल्यों के हिस्से के रूप में आपके प्रोग्राम को बाद में आवश्यकता होगी; स्टैक पर अलग से फंक्शन्स और डेटा स्टोर करने के लिए बचत होती है। यह नियंत्रण प्रवाह को और अधिक भ्रामक बना सकता है, लेकिन जब गोल्फ, रखरखाव को अक्सर पीछे की सीट लेना पड़ता है, और यह अंडरलोड की तरह नहीं है, वैसे भी यह सब प्रयोग करने योग्य है।
(!)
और करता था (~!)
, लेकिन आपका तरीका बेहतर लगता है।
एक चर्च अंक को बढ़ाने के लिए कार्यात्मक रूप से शुद्ध तरीका है लंबो कैलकुलस पूर्ववर्ती फ़ंक्शन का उपयोग करना:
\n.n(\p.\z.z($(pT))(pT))(\z.z0[whatever you define the predecessor of 0 to be])
जहाँ 0 = \ x। \ Yy, T = \ x। \ Yx, और $ उत्तराधिकारी है।
अंडरलोड में फिर से लिखा, यह 28 बाइट्स हैं:
(!())~(!())~(!:(:)~*(*)*~)~^!
यह ठीक है, लेकिन हम अंडरलोड के कुछ उपयोगी गुणों का शोषण कर सकते हैं, अर्थात् वे :!
और ()*
बिना ऑप्स हैं। इसका मतलब है कि, एक संख्या के लिए n
, :ⁿ!!()()*ⁿ
(जहां cⁿ
है c
बार-बार n
बार) पैदावार n-1। उदाहरण के लिए चर्च अंक 3 के लिए ऐसा करने से यह पैदावार होती है:
:::!!()()***
नो-ऑप जोड़े को हटाते हुए, हम प्राप्त करते हैं:
:*
जो 2 है।
तो यह नया और छोटा पूर्ववर्ती ऑपरेशन है:
:(:)~^(!!()())*~(*)~^*
यह 7 बाइट्स छोटा है।
(()~(:))~:(^!!())*~(*)~^**
तो अभी भी 3 बाइट्स कम हैं।
अंडरलोड में वास्तव में दो स्टैक होते हैं- स्ट्रिंग्स का ढेर, और सोर्स कोड बनाने वाले कमांड्स का स्टैक। अंडरलोड का ^
निर्देश हमें स्ट्रिंग्स को पूर्व स्टैक से उत्तरार्द्ध तक ले जाने देता है। ऐसा करने से, हम बहुत सारे अनावश्यक स्टैक हेरफेर को बचा सकते हैं।
उदाहरण के लिए, मान लें कि हमारे पास (a)(b)(c)
मुख्य स्टैक है और हम नीचे के दो तत्वों (c)
को प्राप्त करना चाहेंगे, जिन्हें अनदेखा करना है (ab)(c)
। ऐसा करने का भोला तरीका यह है कि स्टैक को घुमाने के लिए घुमाएं (c)(a)(b)
और फिर पीछे जाएं और वापस स्वैप करें:
a~a~*~a*^*~
ये गलत है। a~a~*~a*^
इस तरह से स्टैक को घुमाने के लिए उपयोग करना बेहद महंगा है, और जब संभव हो तो इससे बचना चाहिए। (c)
इसके बजाय प्रोग्राम स्पेस में डालकर , इसे चार बाइट्स छोटे किए जा सकते हैं:
a(*)~*^
यह विचार है कि जिन निर्देशों को आप निष्पादित करना चाहते हैं उन्हें लें और फिर (c)
अंत में पीछे धकेलने के लिए एक निर्देश जोड़ें और फिर परिणाम का मूल्यांकन करें। इसका मतलब है कि (c)
जब तक हम समाप्त नहीं कर लेते, तब तक हमें चिंता करने की ज़रूरत नहीं है ।
(*)~a*^
, जो मुझे लगता है कि थोड़ा अधिक है। अनिवार्य रूप से ~a*^
है dip
जोय से आदेश।
eval
कमांड है, मैंने पहले कभी इस तरह की भाषा नहीं देखी है।