INTERCAL में गोल्फ के लिए टिप्स


10

INTERCAL में गोल्फिंग के लिए आपके पास क्या सामान्य सुझाव हैं ? मैं उन विचारों की तलाश कर रहा हूं जो गोल्फ चुनौतियों को लागू करने के लिए लागू किए जा सकते हैं और कम से कम कुछ हद तक INTERCAL के लिए विशिष्ट हैं (यानी "टिप्पणियां हटाएं" एक उपयोगी उत्तर नहीं है)।

मुझे पता है कि गोल्फ प्रतियोगिताओं को जीतने के लिए विदेशी भाषाएं वास्तव में उपयोगी हो सकती हैं, लेकिन मुझे यहां के आसपास बहुत ज्यादा इंटरकॉल कोड दिखाई नहीं देता है। क्या आपके पास कोई सलाह है जो लोगों को INTERCAL के साथ प्रतिस्पर्धी कोड आकार प्राप्त करने में मदद कर सकती है? क्या यह भाषा कभी प्रतिस्पर्धी हो सकती है?

INTERCAL को इतना कम आंका गया है कि इसमें कोई टैग भी नहीं है। बहुत दुख की बात...


अधिकांश भाषाओं को अपने स्वयं के टैग की आवश्यकता नहीं होती है, क्योंकि भाषा-विशिष्ट चुनौतियां आम तौर पर हतोत्साहित होती हैं।
एलेक्स ए।

9
एक संकेत है कि यह सबसे अच्छा गोल्फ भाषा नहीं हो सकती है, इसके विकिपीडिया पृष्ठ से:Despite the language's intentionally obtuse and wordy syntax,
isaacg

जवाबों:


2

व्हॉट्सएप / "शोर" को हटाने से आप आगे की अपेक्षा कर सकते हैं

INTERCAL एक व्हाट्सएप-असंवेदनशील भाषा है। अधिकांश व्हाट्सएप-असंवेदनशील भाषाओं के विपरीत, हालांकि, असंवेदनशीलता आपकी अपेक्षा से कहीं अधिक है।

उदाहरण के लिए, DO NOTदो टोकन हैं, लेकिन DONOTपार्सर शिकायत के बिना लिखा जा सकता है (बहुत अधिक व्यापक रूप से उपयोग किए जाने वाले कार्यान्वयन में)। (बेशक, आप भी लिख सकते हैं DON'T, लेकिन यह किसी भी तरह का तनाव नहीं है। हालांकि, इसे पढ़ना आसान हो सकता है, हालांकि, PLEASEN'Tशायद PLEASE NOT, हालांकि, इससे पढ़ना मुश्किल है ।) दरअसल, कुछ बहस है कि क्या व्हाट्सएप कुछ भी करता है; कम से कम एक INTERCAL पार्सर इसे संख्यात्मक स्थिरांक के अंदर भी अनुमति देता है (ऐसा नहीं है कि जब गोल्फ में यह बहुत उपयोगी है)। ध्यान रखने वाली बात यह है कि व्हाट्सएप को हटाने से DO READ OUTवह मिलता है जो अंतःस्थापित होने के कारण कुछ पुराने INTERCAL पार्सर को भ्रमित कर सकता हैDOREADOUTDO(हालांकि उनके लेखक आमतौर पर इसे एक बग मानते हैं, और इस प्रकार आजकल यह आमतौर पर एक वैध कार्यक्रम में काम करता है, यह एक वाक्यविन्यास त्रुटि के आसपास के क्षेत्र में इस तरह कोड डालना उचित नहीं है, क्योंकि तब इसे अस्वीकार करना बहुत कठिन हो सकता है)।

यह भी याद रखें कि आप अंतरिक्ष को बचाने के लिए पात्रों को ओवरपंच कर सकते हैं। ASCII में, आप वास्तव में इसे केवल '.→ से खींच सकते हैं !, लेकिन यह अपने आप में एक अत्यधिक उपयोगी चाल है। (जब आप सरणियों का उपयोग नहीं कर रहे हैं, तब भी कोई स्पार्कस अस्पष्टता की संभावना नहीं है, तब भी जब आपके सभी समूह वर्ण समान हों, इसलिए गोल्फ प्रविष्टियों के लिए, यह 'तब तक छड़ी करने की सिफारिश की जाती है जब तक कि किसी सरणी सबस्क्रिप्ट पूरी तरह से एक की आवश्यकता न हो "।) कोई किताबी कीड़ा हो सकता है। तीन (INTERCAL-72) की आवश्यकता के बजाय (CLC-INTERCAL) के लिए ?संक्षिप्त नाम (C-INTERCAL) या लैटिन -1 का उपयोग करके एक बाइट में प्रतिनिधित्व किया ¥


2

एक बयान में जितना संभव हो उतना काम करने पर ध्यान दें

इंटरकैल के बयान पहचानकर्ता क्रियात्मक हैं; DOप्रत्येक कथन पर दो शोर वर्ण होते हैं, कथन का नाम भी काफी लंबा हो जाता है, और आपको PLEASEपार्सर को खुश रखने के लिए हर एक को फेंकना होगा । (आप जो सबसे अच्छा कर सकते हैं वह चार DOसे एक का अनुपात है PLEASE, जिसका अर्थ है कि आप प्रत्येक 5 कमांड के लिए पहचानकर्ता में 14 वर्णों का उपयोग कर रहे हैं।) दूसरी ओर, अभिव्यक्ति वाक्यविन्यास काफी ट्रिक (हास्यास्पद, लेकिन थकाऊ) है। इसका मतलब यह है कि यह अक्सर एक कार्यक्रम में आपके सार्थक हिस्से को एक एकल अभिव्यक्ति में फिट करता है, यहां तक ​​कि कई बयानों का उपयोग करते हुए चीजों को करने का एक अधिक "प्राकृतिक" तरीका होगा।

उदाहरण के लिए, आप प्रदान करना चाहते हैं, तो #1करने के लिए .1और #2करने के लिए .2बजाय स्पष्ट INTERCAL -72 तरीके से करने का,:

DO.1<-#1DO.2<-#2

यह एक यादृच्छिक चर को ओवरलोड करने पर जोर देने के लायक है, ताकि आप दोनों को एक साथ असाइन कर सकें:

DO:1<-#1$#2

( :1/!1$.2'कार्यक्रम में पहले कहीं फेंक दिए गए; ध्यान दें कि यह संकेतन INTERCAL-72 को काफी हद तक स्थगित करता है, इसलिए आपको काम करने के लिए आधुनिक INTERCAL का उपयोग करना होगा)। यह केवल थोड़ा लंबा है, भले ही आप खाते में सेटअप लेते हैं, और कम हो जाता है अगर तुम कभी, की जरूरत है या करने के लिए, एक साथ करने के लिए असाइन व्यवस्था कर सकते हैं .1और .2एक बार से अधिक।

यह केवल उन कमांड की गणना नहीं है जहां यह ट्रिक काम करती है। यदि आपको किसी चर को दो बार टटोलना है, तो इसे इस तरह से न करें:

DOSTASH.1DOSTASH.1

लेकिन इस तरह:

DOSTASH.1+.1

( +नोटेशन उन अधिकांश कमांड्स के लिए काम करता है, जहाँ यह वैचारिक रूप से काम कर सकता है।)


2

यदि सभी INTERCAL-72-स्टाइल के लिए एक एकल रिज्यूम का उपयोग करें, तो वे संरचित हैं

यदि आपको "यदि" कथन के समतुल्य लिखने की आवश्यकता है, तो INTERCAL-72 कोड का उपयोग करने वाली सामान्य विधि NEXTदो बार है और फिर एक गणना करें RESUME। (आधुनिक कोड में, अक्सर एक गणना COME FROMबेहतर होगी, लेकिन यह टिप आपके कोड को पसंद करती है NEXT।) आपको लगभग निश्चित रूप से पहले के लिए बाइट्स का भुगतान करना होगा NEXT, क्योंकि यह "यदि" की एक शाखा से दूसरी में कूदता है। NEXTजब तक आपके पास बहुत सारे "यदि" कथन न हों, तो दूसरे को साझा करना भी निर्विवाद है #1। हालांकि, RESUMEकार्यक्रम में कहीं भी हो सकता है (क्योंकि नियंत्रण इसे तुरंत कहीं भी छोड़ने जा रहा है)।

इसे संभालने के दो तरीके हैं। यदि आपके पास बहुत सारे "यदि" कथन हैं, तो RESUMEसंभवतः एकल-अंक रेखा संख्या को वारंट करता है, ताकि आपका दूसरा NEXTकथन यथासंभव छोटा हो सके। यदि संभव हो, तो इसे एक गणना बनाने का प्रयास करें जो RESUMEस्वाभाविक रूप से आपके कोड में होगा (स्वाभाविक रूप से, यह मुश्किल है, क्योंकि यह उन लोगों के लिए दुर्लभ है, जो कोड के "सामान्य प्रवाह" में NEXTएड होने की बजाय दिखाई देते हैं ); फिर, केवल लागत लाइन नंबर है। आपको इन सभी के लिए एक एकल बूलियन चर का उपयोग करना होगा NEXT; यहां सर्वसम्मति से सर्वसम्मति का उपयोग करना है .5, ज्यादातर क्योंकि यह चर है जो मानक पुस्तकालय बूलियन रिटर्न मानों के लिए उपयोग करता है।

वैकल्पिक रूप से, यह एक अस्वाभाविक (तकनीकी रूप से अविकसित) का उपयोग करने के लिए संभव है, क्योंकि मैंने मानक पुस्तकालय के फीचर पर इंटरकल डॉक्यूमेंटेशन में एक संकेत दिया है। क्योंकि एक के लिए एक केंद्रीय स्थान RESUMEइतना उपयोगी है, मानक पुस्तकालय आंतरिक रूप से एक का उपयोग करता है। INTERCAL में लाइन नंबर वैश्विक हैं (सम्मेलनों नेमस्पेसिंग साथ है, लेकिन जो यदि आप जानते हैं आप क्या कर रहे टूट किया जा सकता है), तो आप कर सकते हैं NEXTसही मानक पुस्तकालय internals में अगर आप चाहते हैं, और विशेष रूप से, कर सकते हैं NEXTकरने के लिए अपने केंद्रीय फिर से शुरू स्थान । मौजूदा INTERCAL कोड में यह पर्याप्त रूप से लोकप्रिय है कि मौजूदा लाइब्रेरी ब्रेकडाउन को मौजूदा कार्यक्रमों को तोड़ने से बचाने के लिए इसे लागू करना पड़ता है।

प्रश्न में लाइन या तो (कार्यान्वयन के आधार पर शाब्दिक या प्रभावी रूप से) है:

(1001) DO RESUME .5

इसका उपयोग नहीं करने का मुख्य कारण इसकी लंबी लाइन संख्या है; यदि आपको निर्माणों में बहुत अधिक अंतर-72-शैली करने की आवश्यकता है, तो इसे कम संख्या देने के लिए अपने स्वयं का उपयोग करना बेहतर होगा।

बेशक, आप तकनीकों को जोड़ सकते हैं, कुछ ऐसा लिख ​​सकते हैं

(9)DO(1001)NEXT

जो केवल मामूली से अधिक है

(9)DORESUME.5

और यह लाभ है कि बूलियन बन जाते हैं #2और #3(जो पढ़ना मुश्किल है, लेकिन सामान्य रूप से उत्पन्न करना आसान है)। वास्तव में, यह संभाल करने के लिए अतिरिक्त कोड में डालने के लायक भी हो सकता है #0और #1यदि आप बहुत अधिक iffing करने जा रहे हैं (लेकिन गणना COME FROMशायद इस मामले में बेहतर काम करेगी जब तक कि आपकी आवश्यकताएं बहुत अजीब न हों)।


2

INTERCAL पूर्वता निर्दिष्ट नहीं करता है, लेकिन यह अस्पष्ट पूर्ववर्तीता पर भी त्रुटि नहीं करता है

एक अभिव्यक्ति की तरह

#1$#2~#3

अस्पष्ट है, और इसका मतलब हो सकता है

'#1$#2'~#3

या

#1$'#2~#3'

INTERCAL युक्ति यह जानबूझकर अस्पष्ट छोड़ देता है जो कि अभिप्रेत है, और सामान्य तौर पर इसका कोई मानक नहीं है (हालाँकि C-INTERCAL और CLC-INTERCAL एक दूसरे को सरल मामलों में मिलाने का प्रयास करते हैं)। उस ने कहा, मूल गलत नहीं है ; यह अस्पष्ट है और मैं इसे उत्पादन कोड में उपयोग करने की सलाह नहीं दूंगा (लेकिन तब, मैं खुद को उत्पादन कोड में INTERCAL का उपयोग करने की सलाह नहीं दूंगा), लेकिन यह बहुसंख्यक संकलक में कुछ अर्थ रखेगा।

दूसरे शब्दों में, यह सिर्फ समूह पात्रों को हटाने और आपके कार्यक्रम अभी भी काम करने की उम्मीद के लायक हो सकता है। अधिकांश दुभाषिए किसी भी दिए गए अस्पष्ट अभिव्यक्ति को लगातार पार्स करेंगे, इसलिए प्रत्येक जोड़े को वर्णों के समूह के लिए, 1 में 2 मौका है जो अनावश्यक है; यह काफी कुछ बचत तक जोड़ सकता है। (दुर्भाग्य से, INTERCAL पार्सर्स पर्याप्त रूप से भ्रमित करते हैं कि किसी को भी पूरी तरह से यकीन नहीं है कि नियम वास्तव में क्या हैं , लेकिन यह आम तौर पर प्रयोग द्वारा निर्धारित किया जा सकता है। सरलतम मामलों में, ऑपरेटर सभी के लिए समान पूर्वाग्रह रखते हैं और एक सुसंगत सकारात्मकता रखते हैं।)


2

C-INTERCAL में, कोडिंग कोडिंग का उपयोग करके विचार करें CREATE

CREATEबयान आप नए वाक्य रचना बनाने के लिए अनुमति देता है। यह गोल्फिंग में विशेष रूप से उपयोगी है क्योंकि यह आपको छोटे नाम देने की अनुमति देता है। आप एक नए ऑपरेटर को बनाने के माध्यम से इसे प्रभावी ढंग से "एक फ़ंक्शन को परिभाषित करने" के लिए भी उपयोग कर सकते हैं (जिसका बहुत बड़ा फायदा है कि यह आपको फ़ंक्शन को एक अभिव्यक्ति के बीच में कॉल करने देता है)।

यहाँ सेटअप की लागत काफी अधिक है, लेकिन अगर वहाँ एक निर्माण है जो आप बहुत उपयोग करते हैं, तो इसके लिए छोटे सिंटैक्स का आविष्कार करना शायद एक अच्छा विचार है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.