GolfScript में गोल्फ के लिए युक्तियाँ


35

क्या, यह पोस्ट अभी तक मौजूद नहीं है?

बेशक, GolfScript है बनाया , गोल्फ के लिए तो आप सोच सकते हैं कि कोई विशेष सुझाव दिए वास्तव में जरूरत है। लेकिन गोल्फस्क्रिप्ट की सुविधाओं का पूर्ण उपयोग करने के लिए, आपको कुछ गैर-स्पष्ट चाल सीखने की जरूरत है। यह पोस्ट ऐसे ही उपयोगी टिप्स और ट्रिक्स एकत्रित करने के लिए है।

इसके साथ शुरू करने के लिए, यहां आधिकारिक गोल्फस्क्रिप्ट संदर्भ पृष्ठ हैं। तुम सच में अपने आप को इन पहले के साथ परिचित होना चाहिए:

विशेष रूप से, मैं इस क्रम में पृष्ठों को पढ़ने का बहुत सुझाव दूंगा - त्वरित संदर्भ बहुत कम उपयोग का है जब तक कि आप पहले से ही बिल्ट-इन से परिचित नहीं हैं, और ट्यूटोरियल में कुछ महत्वपूर्ण विवरण शामिल हैं जिन्हें अन्य पृष्ठों पर समझाया नहीं गया है। ।


Ps। प्रेरणा और व्यक्तिगत हित के लिए, यहाँ कुछ प्रश्न दिए गए हैं, जिनके उत्तर मुझे अच्छे लगे:

  • गोल्फस्क्रिप्ट में सीमित लिप्यंतरण कैसे करें? {FROM?TO=}%काम करता है अगर आप सुनिश्चित कर सकते हैं कि सभी इनपुट में पाए जाते हैं FROM(या उन सभी को अंतिम तत्व के लिए मैप किए जाने का बुरा नहीं मानते हैं TO), लेकिन सभी तरीके जो मैंने अनमैप किए गए मानों को अपरिवर्तित छोड़ने के लिए देखा है, कमोबेश klugey रहे हैं।

  • कैसे सबसे अच्छा एक स्ट्रिंग ASCII कोड और वापस सरणी में परिवर्तित करने के लिए? साइड इफेक्ट के रूप में कौन से ऑपरेशन करते हैं? स्टैक पर एक स्ट्रिंग में पात्रों को डंप करने का सबसे अच्छा तरीका क्या है (जैसे ~सरणियों के लिए करता है)?


एक और सवाल: वहाँ एक अच्छा तरीका में बदलना ... xहै ... [x]? सबसे अच्छा मैं देख सकता हूँ [.;]
पीटर टेलर

@Peter: यदि xएक संख्या है, तो []+काम करता है और एक चार छोटा है। और हां, अगर xस्टैक पर केवल एक चीज है, तो बस कर ]देगा।
इल्मरी करोनें

मैं करने के लिए सबसे अच्छे तरीके पूछना चाहता हूं: न्यूनतम, अधिकतम और पूर्ण मूल्य। मेरे सभी समाधानों को लगता है कि उन्हें अधिक से अधिक पात्रों को लेना चाहिए।
क्लाउडीयू

किसी दिए गए सूचकांक में एक सरणी को संशोधित करने का सबसे अच्छा तरीका क्या है?
user1502040

@ user1502040: नीचे उत्तर दिया गया। (यदि कोई बेहतर तरीका जानता है, तो कृपया साझा करें!)
इल्मरी करोनें

जवाबों:


29

तर्कसंगत / फ्लोट / कॉम्प्लेक्स

मैंने कई बार पढ़ा है कि गोल्फस्क्रिप्ट में केवल पूर्णांक हैं जो मैंने इसे मानना ​​शुरू कर दिया था। खैर, यह सच नहीं है।

2-1? # Raise 2 to the power of -1. Result: 0.5
4-1? # Raise 4 to the power of -1. Result: 0.25
+    # Add. Result: 0.75

आउटपुट है

3/4

मानक गोल्फस्क्रिप्ट दुभाषिया के साथ और

0.75

पर वेब GolfScript

इसी तरह के हैक तर्कसंगत, फ्लोट या यहां तक ​​कि कॉम्प्लेक्स में डालने की अनुमति देते हैं:

{-2.?./*}:rational
{2.-1??./*}:float
{-2.-1??./*}:complex

9

3
WAT! सुंदर यकीन है कि यह दुभाषिया में एक बग है, लेकिन वाह
दरवाज़े

3
सबसे हाल ही में दुभाषिया की लाइन 82 Gint.new(@val**b.val):। ऐसा लगता है कि Gintकंस्ट्रक्टर एक अंतर कलाकारों को याद कर रहा है ...
प्रिमो

10

एक नंबर की उपेक्षा

एक चीज़ जो गोल्फस्क्रिप्ट की कमी है वह एक बिल्ट-इन निगेटिव ऑपरेटर की है। स्टैक पर एक संख्या को इसके नकारात्मक में बदलने के स्पष्ट तरीके, जैसे , -1*या 0\-, तीन वर्णों की आवश्यकता होती है। हालाँकि, इसे दो तरीकों से करने का एक तरीका है:

~)

यह इसलिए काम करता है क्योंकि GolfScript दो पूरक अंकगणित का उपयोग करता है , ताकि ~ x बराबर - x uses1 ।

बेशक, संस्करण (~भी काम करता है; उनके बीच चयन आम तौर पर स्वाद का मामला है।


9

एक सरणी फेरबदल

GolfScript में एक सरणी फेरबदल करने का सबसे आसान तरीका है कि इसे एक यादृच्छिक सॉर्ट कुंजी द्वारा सॉर्ट किया जाए। यदि आपको केवल कुछ मानों को कम करने की आवश्यकता है, तो निम्न कोड करेगा:

{;9rand}$

ध्यान दें कि, छोटी सूचियों के लिए भी, यह बहुत अच्छा फेरबदल नहीं देगा। जन्मदिन के विरोधाभास के कारण , समान रूप से समान फेरबदल पाने के लिए, तर्क को randसूची की लंबाई के वर्ग की तुलना में काफी अधिक होना चाहिए।

जगह 9के साथ ऊपर 99इस प्रकार दस तत्वों पर निर्भर की सूची के लिए यथोचित अच्छे परिणाम देता है, लेकिन लंबे समय तक सूचियों के लिए ध्यान देने योग्य पूर्वाग्रह दर्शाती है।

निम्नलिखित कोड, जो 9 9 = 387,420,489 संभावित मूल्यों का उपयोग करता है , लगभग 1000 वस्तुओं या तो (और लगभग 20,000 तक स्वीकार्य) के लिए अच्छा है:

{;9.?rand}$

वास्तव में लंबी सूची के लिए, ९९ ९९ 10 ३.7 × १० १ ९ : मान के लिए एक और ९ जोड़ें :

{;99.?rand}$

परिक्षण:

यहां 10-तत्वों की सूची में पहले तत्व का वितरण ऊपर दिखाए गए विभिन्न वेरिएंट का उपयोग करते हुए फेरबदल किया गया है, जिसका नमूना 10,000 से अधिक परीक्षणों में दिया गया है:

  • के उत्पादन 10,{;9rand}$0=से पता चलता है एक बहुत ही स्पष्ट पूर्वाग्रह, साथ 0के रूप में पहले की स्थिति में समाप्त होने की संभावना के रूप में तीन से अधिक बार किया जा रहा है 1:

    0 16537 #######################################################
    1 5444  ##################
    2 7510  #########################
    3 8840  #############################
    4 9124  ##############################
    5 12875 ##########################################
    6 9534  ###############################
    7 8203  ###########################
    8 7300  ########################
    9 14633 ################################################
    
  • के साथ 10,{;99rand}$0=, अधिकांश पूर्वाग्रह समाप्त हो गए हैं, लेकिन ध्यान देने योग्य राशि अभी भी बनी हुई है:

    0 10441 ##################################
    1 9670  ################################
    2 9773  ################################
    3 9873  ################################
    4 10134 #################################
    5 10352 ##################################
    6 10076 #################################
    7 9757  ################################
    8 9653  ################################
    9 10271 ##################################
    
  • साथ 10,{;9.?rand}$0=, उत्पादन मूल रूप से वास्तव में एक नमूने के तौर पर से अप्रभेद्य है:

    0 9907  #################################
    1 9962  #################################
    2 10141 #################################
    3 10192 #################################
    4 9965  #################################
    5 9971  #################################
    6 9957  #################################
    7 9984  #################################
    8 9927  #################################
    9 9994  #################################
    

Ps। संख्यात्मक सरणियों या तारों के वास्तव में खराब फेरबदल के लिए, निम्नलिखित कोड कभी-कभी स्वीकार्य हो सकता है:

{rand}$

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


3
मुझे याद है कि एक बार मुझे संदेह हुआ कि जन्मदिन के विरोधाभास के लिए गणित मेरे भाई ने मुझे इसके बारे में बताया था, वह सही था :(
ajax333221

8

एक विशिष्ट उपश्रेणी को संबोधित करने के लिए:

कैसे सबसे अच्छा एक स्ट्रिंग ASCII कोड और वापस सरणी में परिवर्तित करने के लिए? साइड इफेक्ट के रूप में कौन से ऑपरेशन करते हैं? स्टैक पर एक स्ट्रिंग में पात्रों को डंप करने का सबसे अच्छा तरीका क्या है (जैसे ~ सरणियों के लिए)?

जो लोग इस समस्या को नहीं समझते हैं, उनके लिए गोल्फस्क्रिप्ट प्रकार की प्रणाली क्रम पूर्णांक, सरणी, स्ट्रिंग, ब्लॉक के प्रकारों को प्राथमिकता देती है। इसका मतलब यह है कि एक स्ट्रिंग के लिए लागू साधारण सरणी ऑपरेशन आपको लगभग हमेशा एक स्ट्रिंग देते हैं। उदाहरण के लिए

'ABC123'{)}%

'BCD234'ढेर पर छोड़ देंगे ।

नतीजतन, ASCII कोड की एक स्ट्रिंग में स्ट्रिंग को बदलने का सबसे अच्छा तरीका लगभग निश्चित रूप से पात्रों को ढेर पर डंप करना है और फिर उन्हें एक सरणी में इकट्ठा करना है।

स्टैक पर एक स्ट्रिंग में वर्णों को डंप करने का सबसे अच्छा तरीका क्या है? {}/

ASCII कोड की एक स्ट्रिंग में स्ट्रिंग को परिवर्तित करने का सबसे अच्छा तरीका क्या है? [{}/](सामान्य चेतावनी के साथ कि यदि स्टैक पर कुछ और नहीं है तो आप छोड़ सकते हैं [)

ASCII कोड की एक सरणी को एक स्ट्रिंग में बदलने का सबसे अच्छा तरीका क्या है? ''+(ध्यान दें कि यह भी समतल करता है, इसलिए उदाहरण [65 [66 67] [[[49] 50] 51]]''+देता है 'ABC123')


एक एकल ASCII कोड को स्ट्रिंग में बदलने का सबसे अच्छा तरीका क्या है? []+''+? (लंबे समय तक लगता है)
जस्टिन

@Quincunx, यह लंबा है, लेकिन मुझे कोई बेहतर तरीका नहीं पता है। देखने वाली बात यह हो सकती है कि ASCII कोड कहां से आया है और देखें कि क्या आप इसे पहले से किसी सरणी में पहुंचने के लिए प्राप्त कर सकते हैं।
पीटर टेलर

6

यदि आपका प्रोग्राम रहस्यमय तरीके से टूटता है, तो अपने चर की जांच करें

मैंने सिर्फ एक जाहिरा तौर पर सही प्रोग्राम को डिबग करने में कुछ समय बिताया जो !एक चर के रूप में इस्तेमाल किया गया था (इस आधार पर कि मैं इसे फिर से उपयोग नहीं करने जा रहा था)। दुर्भाग्य से मैं किया उपयोग if, और यह पता चला है कि के कार्यान्वयन ifकॉल !जो शाखा का पालन करने का फैसला करने के लिए।


6

स्टैक के शीर्ष आइटम को एक सरणी में लपेटना

वहाँ एक अच्छा तरीका में बदलना ... xहै ... [x]?

पूर्ण सामान्यता के लिए, सबसे अच्छा विकल्प 4 वर्ण प्रतीत होता है। हालांकि, कुछ विशेष मामलों में इसे कम करना संभव है।

1 चार

]विशेष मामले में काम करता है xजो स्टैक पर एकमात्र चीज है।

3 चरस

[]+xएक पूर्णांक है कि विशेष मामले में काम करता है ।

.,/विशेष मामले में काम करता है जो xएक सत्य सरणी या स्ट्रिंग है। जैसे "AB".,/देता है ["AB"]; 3,.,/देता है [[0 1 2]]। हालाँकि, "".,/और [].,/दोनों देते हैं []

4 चरस

[.;] बिना शर्त काम करता है।


6

किसी दिए गए सूचकांक में एक सरणी को संशोधित करने का सबसे अच्छा तरीका क्या है? - user1502040

यह एक अच्छा सवाल है। GolfScript में किसी ऐरे तत्व को मान देने का कोई सीधा तरीका नहीं है, इसलिए, एक या दूसरे तरीके से, आप पूरे ऐरे को फिर से बनाना चाहते हैं।

एक सरणी xमें सूचकांक iमें एक नया मान सम्मिलित करने का सबसे छोटा सामान्य तरीका यह है कि दिए गए सूचकांक में सरणी को विभाजित करें और xउन्हें फिर से एक साथ जोड़ने से पहले पहले छमाही में संलग्न करें:

  • .i<[x]+\i>+(11 वर्ण) - मान xको सरणी में (0-आधारित) अनुक्रमणिका में डालेंi

करने के लिए बदलने के सूचकांक में मूल्य iके साथ x, हम बस सरणी की दूसरी छमाही एक ही तत्व से कम करने के लिए की जरूरत है:

  • .i<[x]+\i)>+(12 वर्ण) - iमान के साथ तत्व (0-आधारित) सूचकांक पर प्रतिस्थापित करेंx

वैकल्पिक रूप से, पहले छमाही को छोटा करने के बजाय प्रभावी रूप से वही करेंगे, लेकिन 1-आधारित अनुक्रमण के साथ, जो कभी-कभी बेहतर हो सकता है:

  • .i(<[x]+\i>+(12 वर्ण) - iमान के साथ तत्व (1-आधारित) सूचकांक पर प्रतिस्थापित करेंx

उपरोक्त सभी उदाहरणों में, यदि xएक संख्या है, तो इसके चारों ओर चौकोर कोष्ठक दो वर्णों को बचाने के लिए छोड़ा जा सकता है, क्योंकि यह किसी भी तरह से एक सरणी में स्वतः-समन्वित होगा +:

  • .i<x+\i>+(9 वर्ण) - संख्या xको सरणी में (0-आधारित) सूचकांक में डालेंi
  • .i<x+\i)>+(10 वर्ण) - iसंख्या के साथ तत्व (0-आधारित) सूचकांक पर प्रतिस्थापित करेंx
  • .i(<x+\i>+(10 वर्ण) - iसंख्या के साथ तत्व को (1-आधारित) सूचकांक में बदलेंx

कोष्ठक भी छोड़ा जा सकता है यदि या तो xइनपुट या "सरणी" (या दोनों) वास्तव में तार हैं, जिस स्थिति में परिणाम भी एक स्ट्रिंग (सामान्य सरणी → स्ट्रिंग रूपांतरण नियमों का उपयोग करते हुए) एक स्ट्रिंग में coerced किया जाएगा।


Ps। एक विशेष मामले के रूप में, अगर हमें पता है कि सरणी में i2 × iतत्व हैं, तो हम x(0-आधारित) सूचकांक iमें i/[x]*(6 वर्णों) के साथ एक नया तत्व सम्मिलित कर सकते हैं । यह वास्तव में क्या करता है सरणी को iतत्वों तक के टुकड़ों में विभाजित किया जाता है और xप्रत्येक चंक के बीच डाला जाता है । ध्यान दें, इस मामले में, कोष्ठक आवश्यक हैं भले ही xएक संख्या हो।


पी पी एस। एक वैकल्पिक दृष्टिकोण गतिशील रूप से नामित चर का उपयोग करना है। उदाहरण के लिए,

 'foo' 42 ':x'\+~

'foo'वैरिएबल को मान असाइन करेगा x42, जबकि

 42 'x'\+~

इसे पुनः प्राप्त करेंगे।

आप xउपसर्ग को छोड़ कर इसे आगे भी ऑप्टिमाइज़ कर सकते हैं और केवल सीधे संख्यात्मक शाब्दिकों को निर्दिष्ट कर सकते हैं - यह गोल्फस्क्रिप्ट में पूरी तरह से कानूनी है, और आपको असाइनमेंट कोड से एक चार्ट को बचाने और रिट्रीवल कोड को सिर्फ `~(या सभी के लिए, यदि हो, तो छोटा करने की अनुमति देता है) सूचकांक स्थिर है!)। नीचे की ओर, ज़ाहिर है, एक संख्यात्मक शाब्दिक को असाइन करना आपके कोड में कहीं और उस शाब्दिक के मूल्य को ओवरराइड करेगा। अक्सर, हालांकि, संख्या शाब्दिकों के उपयोग से बचा जा सकता है (या कार्यक्रम की शुरुआत तक कम से कम प्रतिबंधित है, उनमें से किसी से पहले पुन: असाइन किया गया है), जिस स्थिति में यह चाल पूरी तरह से ठीक है।


3
पूरी तरह से विषय: 10k पर बधाई! :-D
दरवाज़े

1
यदि आप जानते हैं कि सरणी में डुप्लिकेट मान नहीं हैं, तो आप i9 बाइट्स के लिए इंडेक्स पर मान बदल सकते हैं :.[i=]/[x]*
मार्टिन एंडर

5

अंतिम उत्पादन में हेरफेर

डिफ़ॉल्ट रूप से, जब आपका प्रोग्राम समाप्त होता है, तो गोल्फस्क्रिप्ट दुभाषिया स्टैक पर सब कुछ आउटपुट करता है, साथ ही एक अंतिम नईलाइन, जैसे कि आपका प्रोग्राम समाप्त हो गया है:

]puts

दस्तावेज़ीकरण जो सीधे उल्लेख नहीं करता है वह यह है कि दुभाषिया सचमुच में putsइस उत्पादन का निर्माण करने के लिए कॉल करता है , और यह अंतर्निहित निर्माण का शाब्दिक अर्थ है:

{print n print}:puts;

इस प्रकार, आप अंतिम आउटपुट को पुनर्परिभाषित कर सकते हैं या उसमें हेरफेर कर सकते हैं puts, print और / या n(या  यदि आप वास्तव में मुड़ महसूस कर रहे हैं)। यहाँ कुछ उदाहरण हैं:

अंतिम न्यूलाइन को दबाएं:

'':n;

( ;यदि आप स्टैक पर अतिरिक्त खाली स्ट्रिंग को बुरा नहीं मानते हैं , तो निश्चित रूप से आप इसे छोड़ सकते हैं ।)

पूरी तरह से अंतिम उत्पादन को दबाएं:

:puts

यह putsस्टैक के शीर्ष पर जो कुछ भी होता है उसके साथ ओवरराइट करता है। यदि ऐसा कुछ होता है जिसे आप निष्पादित नहीं करना चाहते हैं, तो आप 0:puts;इसके बजाय उदाहरण के लिए उपयोग कर सकते हैं । ध्यान दें कि यह भी दबाता है p(जिसे परिभाषित किया गया है {`puts}:p;), लेकिन आप अभी भी printआउटपुट के लिए उपयोग कर सकते हैं यदि आप चाहते हैं।


और nothingतुम्हारा मतलब है \n?
कैलक्यूलेटरफलाइन

यदि आपको अनुगामी नईलाइन से ऐतराज नहीं है, तो आप ];अंतिम आउटपुट को दबाने के लिए भी उपयोग कर सकते हैं ।
wastl

5

मैं करने के लिए सबसे अच्छे तरीके पूछना चाहता हूं: न्यूनतम, अधिकतम और पूर्ण मूल्य। मेरे सभी समाधानों को लगता है कि उन्हें अधिक से अधिक पात्रों को लेना चाहिए। - क्लाउडी

न्यूनतम अधिकतम

किसी सरणी में सबसे छोटा / सबसे बड़ा मान ज्ञात करने के लिए, इसे क्रमबद्ध करें और पहला / अंतिम तत्व लें:

  • $0= (3 वर्ण) - एक आरी में न्यूनतम तत्व
  • $-1= (4 वर्ण) - एक सरणी में अधिकतम तत्व

यदि आप सरणी की लंबाई जानते हैं, और यह 10 तत्व या उससे कम है, तो आप -1अंतिम तत्व के सूचकांक के साथ प्रतिस्थापित करके अधिकतम तीन वर्णों में पा सकते हैं ।

यदि आपके पास स्टैक पर मान हैं, तो आप उन्हें पहले एक सरणी में एकत्र कर सकते हैं। इसके लिए, कभी-कभी उपयोगी चाल है जो [\]स्टैक के शीर्ष दो तत्वों को एक सरणी में [@]इकट्ठा करती है , जबकि शीर्ष तीन को इकट्ठा करती है। इस प्रकार, हम प्राप्त करते हैं:

  • [\]$0= (6 वर्ण) - स्टैक पर दो मान न्यूनतम
  • [@]$0= (6 वर्ण) - स्टैक पर न्यूनतम तीन मान
  • [\]$1= (6 वर्ण) - स्टैक पर अधिकतम दो मान
  • [@]$2= (6 चार्ट) - स्टैक पर अधिकतम तीन मान

एक ही चाल का उपयोग तीन मूल्यों के माध्य को खोजने के लिए भी किया जा सकता है, जो कभी-कभी उपयोगी हो सकता है:

  • [@]$1= (6 चार्ट) - स्टैक पर तीन मूल्यों का माध्यिका

स्टैक पर मूल मूल्यों को छोड़ते समय न्यूनतम / अधिकतम दो मानों को खोजने के लिए एक और संभावित उपयोगी ट्रिक है :

  • .2$>$ (5 चार्ट) - मूल मूल्यों को अछूता छोड़ते हुए, स्टैक पर दो मानों को न्यूनतम करें
  • .2$<$ (5 चार्ट) - मूल मूल्यों को अछूता छोड़ते हुए, स्टैक पर अधिकतम दो मान प्राप्त करें

जिस तरह से यह काम करता है वह .2$उलटा क्रम में स्टैक पर शीर्ष दो तत्वों को क्लोन करता है (यानीa ba b b a), </ >प्रतियां और रिटर्न 0 या 1, और अदिश तुलना $तो प्रतियां या तो दो इनपुट तुलना का परिणाम के आधार पर मानों की।


यदि आपके पास स्टैक पर दो nonnegative पूर्णांक हैं, तो आप उनका अधिकतम खोजने के ,\,&,लिए उनके न्यूनतम और ,\,|,(5 वर्णों) को खोजने के लिए (5 वर्णों) का उपयोग कर सकते हैं । इस ट्रिक में रेंज पर क्रमशः सेट चौराहे और यूनियन का उपयोग किया जाता है। आप किसी अन्य वर्ण को सहेज सकते हैं यदि ,उन्हें अलग किए बिना प्रत्येक तर्क पर अलग से लागू करना संभव है । चूंकि यह विधि प्रत्येक तर्क के लिए एक सीमा की गणना करती है, इसलिए यह बड़ी संख्या के लिए बहुत कुशल नहीं है, लेकिन छोटे आदानों के लिए बहुत उपयोगी हो सकती है।

स्टैक पर कम से कम दो गैर-नकारात्मक पूर्णांक खोजने का एक छोटा तरीका है ,<,(3 वर्ण)। काश, यह ट्रिक अधिकतम खोजने के लिए काम नहीं करती।


निरपेक्ष मूल्य

GolfScript बिल्ट-इन निरपेक्ष मूल्य ऑपरेटर है abs(3 वर्ण)। हालांकि यह दो चॉर्स है जितना मैं पसंद करूंगा, सामान्य तौर पर इसे हरा पाना मुश्किल है।

कुछ मामलों में (जैसे निरपेक्ष मूल्य के अनुसार छंटाई के लिए) आपको एक संख्या का वर्ग अपने पूर्ण मूल्य के लिए पर्याप्त विकल्प मिल सकता है; इस दो वर्ण में या तो की जा सकती है, 2?या .*। इस प्रकार, हम प्राप्त करते हैं:

  • {.*}$0= (7 वर्ण) - सरणी में निरपेक्ष मान से न्यूनतम तत्व
  • {.*}$-1= (8 वर्ण) - सरणी में निरपेक्ष मान से अधिकतम तत्व

इसी तरह, उदाहरण के परीक्षण के बजाय यदि किसी संख्या का पूर्ण मान 3 abs 3<(6 वर्ण, अंतरिक्ष सहित) से कम है, तो आप परीक्षण कर सकते हैं कि इसका वर्ग 9 से कम है .*9<(4 वर्ण, कोई स्थान आवश्यक नहीं)।


यदि आपके पास स्टैक पर दो nonnegative पूर्णांक हैं, तो आप उनका अधिकतम खोजने के ,\,&,लिए उनके न्यूनतम और ,\,|,(5 वर्णों) को खोजने के लिए (5 वर्णों) का उपयोग कर सकते हैं । इस ट्रिक में रेंज पर क्रमशः सेट चौराहे और यूनियन का उपयोग किया जाता है। आप किसी अन्य वर्ण को सहेज सकते हैं यदि ,उन्हें अलग किए बिना प्रत्येक तर्क पर अलग से लागू करना संभव है । चूंकि यह विधि प्रत्येक तर्क के लिए एक सीमा की गणना करती है, इसलिए यह बड़ी संख्या के लिए बहुत कुशल नहीं है, लेकिन छोटे आदानों के लिए बहुत उपयोगी हो सकती है।
किरान्सनवे

@KirarinSnow: धन्यवाद! मैंने इसे उत्तर में जोड़ दिया है।
इल्मरी करोनें

4

किसी सरणी से डुप्लिकेट निकालना

सेट ऑपरेटर |(संघ), &(चौराहे) और ^(सममित अंतर) एक में कई सरणी तत्वों को ध्वस्त कर देंगे। इस प्रकार, किसी सरणी से डुप्लिकेट तत्वों को निकालने का सबसे सरल तरीका यह है कि वह अपने संघ या चौराहे को अपने साथ ले जाए:

.|

या:

.&

ये ऑपरेटर स्ट्रिंग्स को वर्णों के सरणियों के रूप में मानेंगे, इसलिए उनका उपयोग डुप्लिकेट वर्णों को स्ट्रिंग्स से निकालने के लिए भी किया जा सकता है।


4

सीमित लिप्यंतरण

एक विशिष्ट उपश्रेणी को संबोधित करने के लिए: एक तार दिया जाता है, एक प्रदर्शन करने का सबसे अच्छा तरीका क्या है tr? उदाहरण के लिएtr/ABC/abc/

यदि स्ट्रिंग के सभी वर्ण प्रभावित होंगे, तो यह काफी आसान है: {'ABC'?'abc'=}%(ओवरहेड: 9 वर्ण)।

हालाँकि, यह टूट जाता है यदि कुछ वर्णों का अनुवाद नहीं किया गया है और 'ABC'?देता है-1

यदि लिप्यंतरण गैर-चक्रीय है, तो इसे एक बार में एक से एक स्ट्रिंग स्प्लिट्स और जॉइन में बदला जा सकता है: 'AaBbCc'1/2/{~@@/\*}/(ओवरहेड: 15 वर्ण)। यह कामचलाऊ हो सकता है, लेकिन एक वैकल्पिक दृष्टिकोण है जो वर्तमान में बेहतर है और चक्रीय लिप्यंतरण के लिए काम करता है।

वर्तमान में, सबसे छोटे सामान्य समाधानों में 14 पात्रों का ओवरहेड है:

  • एक दृष्टिकोण में एक भागने चरित्र शामिल है: जहां एक शाब्दिक नल बाइट को दर्शाता है। (बेशक, यह विधि पूरी तरह से सामान्य नहीं है : यह किसी अन्य चरित्र को एक शून्य बाइट में मैप नहीं कर सकती है।){.'ABC'?'abc0'=\or}%0

  • वैकल्पिक रूप से, {.'ABC'?'abc'@),+=}%एक ही ओवरहेड है, लेकिन केवल मुद्रण योग्य ASCII वर्णों का उपयोग करता है। यह @),+सुनिश्चित करने के लिए एक जटिल (लेकिन, जाहिर है, सबसे छोटा) तरीका है कि प्रतिस्थापन स्ट्रिंग हमेशा इनपुट चरित्र के साथ समाप्त होता है।


अंतिम दृष्टिकोण का उपयोग करते हुए, इनपुट स्ट्रिंग के लिए 'ABCDEF'मुझे परिणाम मिलता है 'abc000', लेकिन सही परिणाम होगा 'abcDEF'। क्या मैं कुछ भूल रहा हूँ?
क्रिस्टियन लुपस्कू

1
@ w0lf, कि 0 बोल्ड में है क्योंकि यह भागने वाला चरित्र है जो पहले उल्लेख किया गया है - यानी बाइट 0.
पीटर टेलर

4

एक स्ट्रिंग को चार की सरणी में बदल दें

आप इसे टाइप करके कर सकते हैं: इसके 1/बाद।

उदाहरण: "String"1/सरणी को ढेर करने के लिए धक्का ['S''t''r''i''n''g']

यह तब आसान है जब आप स्ट्रिंग के चारों ओर घूमना चाहते हैं।


1
क्या आप इस बात का उदाहरण दे सकते हैं कि यह कैसे उपयोगी हो सकता है? स्ट्रिंग्स पहले से ही सरणियों की तरह काम करते हैं इसलिए यह उपयोगी नहीं लगता है।
जस्टिन

@Quincunx यह तब काम आता है जब आप वर्णों को पॉप करना चाहते हैं न कि उनकी
एस्की

और आप ऐसा कब करना चाहेंगे?
जस्टिन

5
@Quincunx: एक स्ट्रिंग घूर्णन, उदाहरण के लिए। "abc"1/(+-> "bca", लेकिन "abc"(+-> bc97
डेनिस

4

संख्या शाब्दिक को असाइन करना

अक्सर, लिखने के बजाय 1:xऔर फिर चर का उपयोग / अद्यतन करने के लिए x, आप 1सीधे उपयोग और अपडेट कर सकते हैं:

1:^;{^.p.+:^;}5*
{1.p.+:1;}5*       (4 bytes shorter)

बेशक, यह अन्य शुरुआती मूल्यों के लिए भी काम करता है, लेकिन अगर आपके कोड में यह मूल्य कहीं और होता है तो टूट जाएगा।

चर नामों के रूप में विराम चिह्न

आप तो है उपयोग करने के लिए चर, यह भी अक्सर बुद्धिमान विराम चिह्न हो जो पहले से अपने कोड में उपयोग करने के लिए है - कार्यक्रमों के बहुत सारे के बिना कर सकते हैं &, |,^ , या ?। इस तरह, उदाहरण के लिए, आप अपने वेरिएबल को पुश &nकरने के x nलिए लिख सकते हैं और फिर एक न्यूलाइन को पुश कर सकते हैं ।


3
कुछ असाइनमेंट में अप्रत्याशित दुष्प्रभाव हो सकते हैं, हालांकि। विशेष रूप से, करने के लिए बताए !अक्सर एक बुरा विचार है, क्योंकि यह टूट जाएगा है ifऔर do(और साथ ही while, until, and, orऔर xor)। इसी प्रकार, orदुभाषिया द्वारा परिभाषित के लिए एक उपनाम के रूप में 1$\if, इसलिए पुनर्परिभाषित 1, $या \इसे भी तोड़ देगा। पुनर्परिभाषित `टूट जाता है p
इल्मरी करोनें

3

एक सरणी छानना

किसी सरणी को फ़िल्टर करने का सबसे सामान्य तरीका उपयोग करना है { },, जो सरणी के प्रत्येक तत्व के लिए कोड ब्लॉक का मूल्यांकन करता है, और उन तत्वों का चयन करता है जिनके लिए परिणामी मान सत्य है (यानी यह grepपर्ल में जैसा कार्य करता है )।

हालांकि, सरणी घटाव ऑपरेटर -का उपयोग करना अक्सर कम होता है। यह ऑपरेटर दो सरणियों को लेता है, और पहले से दूसरे सरणी में होने वाले प्रत्येक तत्व को निकालता है। यह पहले सरणी में तत्वों के क्रम में बदलाव नहीं करता है या डुप्लिकेट को ध्वस्त करता है। एक गैर-ढहने वाले सरणी चौराहे ऑपरेटर को उपज के लिए दो बार घटाव ऑपरेशन लागू करने के लिए एक उपयोगी चाल है:

  • a b -: सरणी में पाए गए किसी भी तत्व को सरणी bसे हटा देंa
  • a. b --: किसी भी तत्व को सरणी से सरणी में नहीं निकालेंba

विशेष रूप से, इसका उपयोग किसी सरणी में किसी तत्व की संख्या को गिनने के लिए किया जा सकता है :

  • a.[c]--,: cसरणी में तत्व होने वाले समय की संख्या की गणना करेंa

सामान्य तौर पर, यह विधि इष्टतम नहीं है, क्योंकि या तो:

  • a[c]/,(: cसरणी में तत्व होने वाले समय की संख्या की गणना करेंa
  • a{c=},,: cसरणी में तत्व होने वाले समय की संख्या की गणना करेंa

एक वर्ण छोटा होता है (और, यदि यह गिनती के लिए ठीक है, तो a[c]/,एक वर्ण को अधिक सहेजता है)। हालांकि, विशेष मामले में जहां cएक संख्या है और aएक सामान्य सरणी (स्ट्रिंग नहीं) है, cक्योंकि इसके चारों ओर वर्ग कोष्ठक को छोड़ा जा सकता है क्योंकि- ऑपरेटर उसी तरह से अपने तर्क प्रस्तुत करता है:

  • a.c--,: cसरणी में होने वाली संख्या की संख्या गिनें (स्ट्रिंग नहीं!)a

(यदि aएक स्ट्रिंग है और c0 से 9 के बीच की एक संख्या है, a.c--समय की संख्या की गणना होती है अंकों c में होता हैa ।)


एक समान चाल एक सरणी में सबसे आम तत्व खोजने के लिए उपयोग किया जा सकता है :

:a{a\[.]-,}$0=

फिर से, यदि इनपुट संख्याओं की एक सरणी है, तो पूरे [.]अनुक्रम को छोड़ा जा सकता है। काश, यह बिना तार के काम नहीं करता [.]


गणना की घटनाओं (सामान्य मामले) के लिए, a[c]/,(और a{c=},,एक बाइट कम होती हैं।
डेनिस

@ डेनिस: धन्यवाद! मैंने उसे संपादित किया है।
इल्मरी करोनें

3

STDIN से पढ़ें

GolfScript स्टड से पढ़ सकते हैं:

"#{STDIN.read}"

यह EOF तक पहुंचने तक STDIN से पढ़ना जारी रखेगा। वैकल्पिक रूप से:

"#{STDIN.gets}"

या

"#{STDIN.readline}"

उपलब्ध अन्य चीजें:

getbyte
getc
gets([sep])
gets(limit)
gets(sep, limit)
inspect # perhaps useful for an underhanded contest
isatty
read([length])
readbyte
readchar
readline([sep])
readline(limit)
readline(sep, limit)
readlines([sep])
readlines(limit)
readlines(sep, limit)
readpartial(maxlen [, outbuf])

इनमें से प्रत्येक के लिए, उनका उपयोग केवल एक बार किया जा सकता है (और पैरामीटर के प्रत्येक परिवर्तन के लिए एक बार भी, खाली कोष्ठक के साथ भी एक बार); उसके बाद, मूल मूल्य वह है जो आपको नए मूल्य के बदले मिलेगा।


2
आप एक टिप्पणी जोड़ना चाहते हैं जो {"#{STDIN.readline}"p}2*2 पंक्तियों को नहीं पढ़ती है, लेकिन इसके बजाय स्ट्रिंग का केवल एक बार मूल्यांकन किया जाता है।
हावर्ड

2
यदि आप iकिसी भी पूर्णांक को इनिशियलाइज़ करते हैं, '"#{'i):i';STDIN.gets}"'++~तो हर बार मूल्यांकन के बाद एक अलग परिणाम देगा। बैकटिक्स भी ध्यान देने योग्य हो सकता है। यदि हम लिनक्स को मानते हैं, तो हम `head -1`इसके बजाय , उदाहरण के लिए, का उपयोग कर सकते हैं STDIN.gets
डेनिस

@ डेनिस: "#{var'g','gpush Gstring.new(STDIN.gets)'.cc}";आपको एक नए गोल्फस्क्रिप्ट ऑपरेटर को भी परिभाषित करने देगा जो स्टडg से एक पंक्ति पढ़ता है और इसे स्टैक पर धकेलता है।
इल्मरी करोनन

2

डिकोडिंग हेक्साडेसिमल इनपुट

GolfScript में कोई हेक्स पूर्णांक शाब्दिक नहीं है, इसलिए, अफसोस, आप केवल हेक्साडेसिमल इनपुट को पार्स नहीं कर सकते ~ । इसके बजाय, यदि आपके कोड को हेक्स इनपुट लेना चाहिए, तो आपको इसे मैन्युअल रूप से पार्स करना होगा।

यह 8-char लूप, एक स्ट्रिंग पर लागू होता है, लोअरकेस हेक्स अंकों को उनके संख्यात्मक समकक्षों में परिवर्तित करेगा:

{39%9-}%

यदि आपको (भी) अपरकेस हेक्स अंकों को स्वीकार करना है, तो सबसे आसान (और संभवतया सबसे छोटा) समाधान 32|कुल 11 वर्णों के लिए उनके साथ कम करना है :

{32|39%9-}%

ध्यान दें कि आउटपुट तकनीकी रूप से अभी भी एक स्ट्रिंग होगा (ASCII वर्ण 0 - 15 से मिलकर), लेकिन अधिकांश गोल्फस्क्रिप्ट सरणी फ़ंक्शन स्ट्रिंग्स को भी स्वीकार करेंगे। यदि आपको एक सरणी की आवश्यकता है, तो आप हमेशा उपयोग कर सकते हैं [{39%9-}/](जहां [स्टैक अन्यथा खाली है तो पहला वैकल्पिक है)।

कोड के आउटपुट को पूर्णांक में बदलने के लिए, आप बस 16base(6 वर्णों) का उपयोग कर सकते हैं । यदि आप इसके बजाय बाइट्स की एक सरणी चाहते हैं, तो सबसे छोटा समाधान मैंने पाया है कि प्रत्येक जोड़े को हेक्स अंकों के साथ 2/{16base}%(11 वर्णों) को डिकोड करना है । सभी को एक साथ रखा, सबसे छोटा कोड जो मैंने हेक्स स्ट्रिंग को बाइट सरणी में बदलने के लिए पाया है, 8 + 11 = 19 वर्ण है:

{39%9-}%2/{16base}%

ध्यान दें कि इस कोड का आउटपुट वास्तव में एक सरणी है, न कि एक स्ट्रिंग। यदि आवश्यक हो, तो आप इसे उदाहरण के लिए जैसे कि ""+, या यदि आप अंत में एक अतिरिक्त नई रेखा को बुरा नहीं मानते हैं, तो इसे कड़ा कर सकते हैं n+


2

नए अंतर्निहित ऑपरेटरों को परिभाषित करना

मानक गोल्फस्क्रिप्ट दुभाषिया में शायद ही कभी इस्तेमाल की जाने वाली सुविधा होती है जो रूबी कोड को दोहरे उद्धृत स्ट्रिंग शाब्दिक रूप में प्रक्षेपित करने की अनुमति देती है।

इस सुविधा का अधिक सामान्यतः उपयोग न करने का एक कारण यह है कि अजीब तरह से, संकलित कोड को संकलन समय पर निष्पादित किया जाता है , और आउटपुट को GolfScript दुभाषिया द्वारा कैश किया जाता है, ताकि उसके बाद समान स्ट्रिंग शाब्दिक हमेशा एक ही मूल्य प्राप्त कर सके, अंदर भी स्ट्रिंग इम्फ़ाल।

हालांकि, एक बात यह है कि यह फीचर रूबी कोड में लागू नए गोल्फस्क्रिप्ट ऑपरेटरों को परिभाषित करने के लिए अच्छा है। उदाहरण के लिए, यहां नए बाइनरी एडिशन ऑपरेटर को परिभाषित करने का तरीका बताया गया है, जो बिल्ट-इन +ऑपरेटर की तरह काम करता है :

"#{var'add','gpush a+b'.cc2}";

इससे कोई फर्क नहीं पड़ता कि आपने अपने कोड में परिभाषा कहाँ रखी है; जैसे ही रूबी कोड युक्त दोहरे भाग वाले स्ट्रिंग को पार्स किया जाता है, वैसे ही नया ऑपरेटर परिभाषित हो जाता है। addऑपरेटर ऊपर परिभाषित काम करता है वास्तव में की तरह निर्मित +ऑपरेटर, और बिल्कुल उसी तरह इस्तेमाल किया जा सकता:

1 2 add          # evaluates to 3
"foo" "bar" add  # evaluates to "foobar"

बेशक, एक नए अतिरिक्त ऑपरेटर को परिभाषित करना बहुत बेकार है, जब तक कि आपने कुछ मूर्खतापूर्ण तरीके से नहीं किया है जैसे अंतर्निहित निर्माण को मिटा दें+ ऑपरेटर को । लेकिन आप नए ऑपरेटरों को परिभाषित करने के लिए उसी चाल का उपयोग कर सकते हैं जो गोल्फस्क्रिप्ट को आसानी से नहीं कर सकता है, जैसे कि कहते हैं, समान रूप से एक सरणी फेरबदल करना:

"#{var'shuf','gpush a.factory(a.val.shuffle)'.cc1}";

10,shuf          # evaluates to 0,1,2,...,9 in random order

या पूरे स्टैक की सामग्री को प्रिंट करना:

"#{var'debug','puts Garray.new($stack).ginspect'.cc}";

4,) ["foo" debug  # prints ["" [0 1 2] 3 "foo"], leaving the stack untouched

या इंटरैक्टिव इनपुट:

"#{var'gets','gpush Gstring.new(STDIN.gets)'.cc}";

]; { "> " print gets ~ ]p 1 } do   # simple GolfScript REPL

या यहां तक ​​कि वेब एक्सेस:

"#{
  require 'net/http'
  require 'uri'
  var'get','gpush Gstring.new(Net::HTTP.get_response(URI.parse(a.to_s)).body)'.cc1
}";

"http://example.com" get

बेशक, कुछ हद तक गोल्फ खिलाड़ी (और जोखिम भरा!) उत्तरार्द्ध का कार्यान्वयन उदाहरण के लिए होगा:

"#{var'get','gpush Gstring.new(`curl -s #{a}`)'.cc1}";

अपने आप में विशेष रूप से गोल्फ नहीं है, यह आपको गोल्फस्क्रिप्ट की क्षमताओं का विस्तार करने की अनुमति देता है जो अंतर्निहित कमांड प्रदान करता है।


यह कैसे काम करता है?

इस तरह से नए गोल्फस्क्रिप्ट ऑपरेटरों को कैसे परिभाषित किया जाए, इस पर आधिकारिक संदर्भ, दुभाषिया के लिए स्रोत कोड है । उस ने कहा, यहाँ कुछ त्वरित सुझाव है:

  • nameरूबी कोड चलाने वाले एक नए ऑपरेटर को परिभाषित करने के लिए code, उपयोग करें:

    var'name','code'.cc
  • कोड के अंदर, gpopस्टैक से एक मान को पढ़ने के लिए और gpushएक को वापस धकेलने के लिए उपयोग करें। आप सरणी के माध्यम से सीधे स्टैक तक भी पहुंच सकते हैं $stack। उदाहरण के लिए, दोनों को aऔर bढेर पर धकेलने के लिए, यह करने के लिए गोल्फ खिलाड़ी $stack<<a<<bहै gpush a;gpush b

    • [सरणी प्रारंभ मार्कर की स्थिति को सरणी में संग्रहीत किया जाता है $lbgpopसमारोह उनकी स्थिति ढेर सिकुड़ती नीचे अगर नीचे इन मार्कर का समायोजन, लेकिन जोड़ तोड़ का ख्याल रखता है $stackसीधे सरणी नहीं करता है।
  • .ccरूबी कोड को एक स्ट्रिंग में एक गोल्फस्क्रिप्ट ऑपरेटर में संकलित करने की स्ट्रिंग विधि सिर्फ एक सुविधा आवरण है Gblock.new()। इसके वेरिएंट भी हैं .cc1, .cc2और .cc3यह ऑपरेटर को स्वचालित रूप से स्टैक से 1, 2 या 3 तर्क देता है और उन्हें चर में असाइन करता है a, bऔर c। एक ऐसी .orderविधि भी है जो काम करती है .cc2, सिवाय इसके कि यह स्वचालित रूप से टाइप प्राथमिकता के आधार पर तर्क देती है ।

  • GolfScript ढेर पर सभी मान रहे हैं (और होना चाहिए!) प्रकार की वस्तुओं Gint, Garray, Gstringया Gblock। अंतर्निहित देशी पूर्णांक या सरणी, जहां आवश्यक हो, .valविधि के माध्यम से पहुँचा जा सकता है ।

    • हालाँकि, ध्यान दें कि Gstring.valएक सरणी देता है Gint! Gstringएक देशी रूबी स्ट्रिंग को चालू करने के लिए , .to_sइसके बजाय उस पर कॉल करें (या इसे उस संदर्भ में उपयोग करें जो स्वचालित रूप से करता है, जैसे स्ट्रिंग प्रक्षेप)। .to_gsकिसी भी जीएस मूल्य पर कॉल करना इसे एक में बदल देता है Gstring, इसलिए किसी भी जीएस मूल्य के साथ सख्ती की जा सकती है .to_gs.to_s
  • यह gpushफ़ंक्शन संबंधित GS प्रकारों में देशी रूबी नंबर, स्ट्रिंग्स या सरणियों को ऑटो-रैप नहीं करता है, इसलिए आपको अक्सर यह स्वयं स्पष्ट रूप से कॉल करके करना होगा Gstring.new()। यदि आप स्टैक पर GS मान प्रकारों में से एक के अलावा कुछ भी धक्का देते हैं, तो कोई भी कोड जो बाद में हेरफेर करने की कोशिश करता है, दुर्घटनाग्रस्त होने की संभावना है।

  • GS मान प्रकार में एक .factoryविधि भी होती है जो टाइप के कंस्ट्रक्टर को कॉल करती है, जो उनकी सामग्री में हेरफेर करने के बाद सरणियों / स्ट्रिंग्स को फिर से तैयार करने के लिए उपयोगी हो सकता है। सभी प्रकारों में एक .coerceविधि भी होती है जो टाइप ज़बरदस्ती करती है : a.coerce(b)एक जोड़ी युक्त रिटर्न देता है aऔर bएक ही प्रकार के लिए मजबूर किया जाता है।

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