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


12

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


मैं अनिश्चित हूँ अगर इसे सामान्य रूप से बेफ़ुज में बदल दिया जाना चाहिए, लेकिन बेफ़ुंज 93 98 की तुलना में गोल्फ के लिए बहुत कम आदर्श है।
जस्टिन

6
हमारे पास हाल ही में Befunge 93 विषय थे, लेकिन मुझे लगता है कि इसके बजाय इस विषय को सामान्य बनाना बेहतर होगा। क्या यह ठीक होगा? (और हो सकता है कि कौन से संस्करण के लिए कौन-से टिप्स अच्छे हैं, ठीक उसी तरह से, जैसे पायथन युक्तियाँ कहती हैं कि क्या वे पायथन 2 / पायथन 3 विशिष्ट हैं)
Sp3000

जवाबों:


9

बहु-पंक्ति लूप का उपयोग करते समय, इसका यथासंभव उपयोग करने का प्रयास करें:

>1234....v
^        <

बनाम

>1234v
^....<

7

एक सशर्त के बाद एक मूल्य को गिराने की आवश्यकता है (जैसे कि दूसरा मार्ग मूल्य पर निर्भर करता है, लेकिन यह एक नहीं है)? उपयोग करने के बजाय >$या $<, इस तथ्य का ध्यान रखें कि आप चर के सत्य मूल्य को जानते हैं और _बदले दिशा और पॉप स्टैक दोनों के बजाय उपयोग करते हैं।

उदाहरण

'* : v           >$ .. @          Prints number in binary followed by the original
                                  decimal number.
     > :2%\2/ :!#^_ \.

में बदल जाता है

'* : v           _  .. @          Since we know that the topmost value on the stack
                                  will be 0, we combine `>$` into `_`.
     > :2%\2/ :!#^_ \.

6

मत भूलो कि 0हमेशा स्टैक पर है। उदाहरण के लिए, इसका मतलब है कि, एक खाली स्टैक के साथ, gबराबर है 00gऔर pबराबर है 000p


5

यदि आपको 15 से बड़ी संख्या पुश करने की आवश्यकता है, 'तो अगले वर्ण का ASCII मान प्राप्त करने के लिए उपयोग करें:

'*

के बजाय 42 पुश करने के लिए:

4a*2+

या, 67*भी काम करता है
दरवाज़े

4
@Doorknob शायद मुझे अपनी बात स्पष्ट करने के लिए एक प्रमुख संख्या चुननी चाहिए थी, लेकिन 42 इतनी बड़ी संख्या है।
जस्टिन

2
ध्यान दें कि यह टिप केवल Befunge-96 और बाद में लागू होता है। Befunge-93 ने 'निर्देश का समर्थन नहीं किया ।
जेम्स होल्डरनेस

4

उपयोग करने के बजाय |, एक और लाइन (अक्सर कई अतिरिक्त रिक्त स्थान के साथ) की आवश्यकता होती है, उपयोग करने का प्रयास करें j। उदाहरण के लिए:

01-`j@more code here

यदि स्टैक के शीर्ष पर संख्या नकारात्मक थी और आगे की ओर जारी रहेगी तो रुक जाएगी। आप कई पात्रों की जरूरत है, उपयोग n*jजहां nवर्णों की संख्या की जरूरत है जब को भेजे गए मान है jहै 0। उदाहरण:

01-`4*j01-*more code

जो एक ऋणात्मक संख्या को नकार देगा।


ध्यान दें कि यह टिप केवल Befunge-96 और बाद में लागू होता है। Befunge-93 ने jनिर्देश का समर्थन नहीं किया ।
जेम्स होल्डरनेस

4

Befunge-93 में, यदि पहली चीज जिसे आप स्टैक पर जोर दे रहे हैं, वह एक स्ट्रिंग है, तो आप अक्सर उद्घाटन उद्धरण छोड़ने के साथ दूर हो सकते हैं। उदाहरण के लिए यह:

"!iH",,,@

इसे सरल बनाया जा सकता है:

!iH",,,@

इसे ऑनलाइन आज़माएं!

क्या हो रहा है दुभाषिया पहले अयोग्य स्ट्रिंग में वर्ण निष्पादित करने का प्रयास करता है। !प्रदर्शन एक हानिरहित नहीं है, और iऔर Hवैध निर्देश, ताकि वे ध्यान नहीं दिया रहे हैं (हालांकि कुछ कार्यान्वयन पर आपको यह चेतावनी मिलती हो सकते हैं) नहीं हैं।

जब "सामना किया जाता है, तो इसे स्ट्रिंग की शुरुआत माना जाता है, लेकिन क्योंकि कोई समापन बोली नहीं है, यह प्लेफील्ड के चारों ओर तब तक लपेटता है जब तक कि "दूसरी बार सामना नहीं किया जाता है। स्टैक पर धकेल दिया गया अंत क्या है:

,,,@  ···72 spaces···  !iH

चूंकि हम केवल पिछले कुछ पात्रों की परवाह करते हैं, हालांकि, उस सामान में से कोई भी मायने नहीं रखता है। तो बोली के बाद, हम अंत में तीन ,कमांड को निष्पादित करने के लिए मिलते हैं , संदेश लिखकर, और @कमांड, जो बाहर निकलता है।

ध्यान दें कि यह आमतौर पर Befunge-98 में काम नहीं करेगा, क्योंकि एक गैर-मान्यता प्राप्त निर्देश दुभाषिया को अनदेखा करने के बजाय प्रतिबिंबित करेगा।


Befunge-98 में आप इसके बजाय आवश्यक स्ट्रिंग को पंक्ति के अंत में रख सकते हैं , जैसे; ",,,@!iH। ध्यान दें कि FBBI नहीं करता है, जबकि Pyfunge एक अतिरिक्त स्थान जोड़ता है।
जो राजा

@JoKing मैं सुझाव नहीं देना चाहता था, क्योंकि, जैसा कि आपने बताया, व्यवहार एक दुभाषिया से दूसरे में भिन्न होता है। और यहां तक ​​कि जब यह काम करने लगता है, तो यह असंगत है ( इस मामले में FBBI में अतिरिक्त स्थान पर ध्यान दें ), इसलिए यह संभवतः एक बग है जो कुछ बिंदु पर तय किया जा सकता है।
जेम्स होल्डरनेस

हम्म ... मुझे लगता है कि अंतरिक्ष वास्तव में विनिर्देश का हिस्सा हो सकता है। मुझे याद है कि कहीं न कहीं यह पढ़कर कि एक ही स्थान को छोड़ कर कई स्थानों को छोड़ दिया जाएगा। PyFunge और FBBI दोनों में उदाहरण । FBBI प्रत्येक लाइन को सबसे लंबी लाइन की लंबाई तक पैड करता है जबकि PyFunge अतिरिक्त रिक्त स्थान को जोड़ता है।
जो राजा

आप सही हैं - कल्पना कहती है कि एक स्ट्रिंग में कई स्थानों को एक ही स्थान माना जाना चाहिए। वास्तव में उस नियम को विशेष रूप से एक अनन्त प्लेफ़ील्ड में तार लपेटने की समस्या से निपटने के लिए प्रस्तावित किया गया था (इसलिए PyFunge स्पष्ट रूप से AFAIC सही है)। लेकिन रैपिंग एल्गोरिथ्म का कल्पना विवरण व्याख्या के लिए कुछ हद तक खुला है, इसलिए मैं समझ सकता हूं कि कुछ कार्यान्वयन चीजों को अलग तरीके से क्यों कर सकते हैं। लेकिन लब्बोलुआब यह एक काफी जटिल मुद्दा है, और मुझे लगता है कि यह बेफ़ुंज -97 / 98 के लिए एक अलग टिप के रूप में बेहतर कवर किया जाएगा।
जेम्स होल्डरनेस

4

Befunge-93 में, अक्सर एक लूप को एक पंक्ति में समतल करने के लिए फायदेमंद हो सकता है, कोड के लूप अनुभाग को दोनों दिशाओं में निष्पादित किया जाता है।

उदाहरण के लिए, नीचे दिए गए कोड पर विचार करें, जो aआठ बार पत्र को आउटपुट करता है :

"a"9>1-:#v_@
    ^\,:\<

यह पुल निर्देश ( #) के साथ लूप अनुक्रम को चौराहे द्वारा एक रेखा में समतल किया जा सकता है

"a"9>1#\-#,:#:>#\_@

इसे ऑनलाइन आज़माएं!

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

इस विशेष मामले में, कोड को आगे भी संपीड़ित किया जाना चाहिए ताकि यह अनुक्रम :#:बस के साथ बदल दिया जा सके :

"a"9>1#\-#,:>#\_@

इसे ऑनलाइन आज़माएं!

वास्तव में, किसी भी समय आपके पास एक ही निर्देश एक #कमांड के दोनों तरफ दोहराया जाता है , आप इसे केवल एक निर्देश के लिए सरल कर सकते हैं, इसलिए यह एक ऐसी चीज है जिसे आपको हमेशा लूप को समतल करते समय देखना चाहिए।

यह समझने के लिए कि यह कैसे काम करता है, यह लूप अनुक्रम को दो बार लिखने में मदद कर सकता है, एक बार #हटाए गए सभी वर्णों के साथ (यानी बाएं से दाएं निष्पादित करते समय क्या होता है), और एक बार #हटाए जाने से पहले पात्रों के साथ (यानी बाएं से दाएं निष्पादित करना) )।

"a"9>1#\-#,:>#\_@
    >1  -  :>  _      ; executing left to right
    >  \  ,:  \_      ; executing right to left

अब आप स्पष्ट रूप से देख सकते हैं कि यह कोड के मूल दो लाइन संस्करण से कैसे मेल खाता है।


3

एक्ज़िट कोड द्वारा आउटपुट, जहां यह एक अनुमत आउटपुट फॉर्म है। यदि चुनौती आपको एक नंबर प्रिंट करने के लिए कहती है, तो आप प्रोग्राम को समाप्त करने के qबजाय एक बाइट बचा सकते हैं.@


2
ध्यान दें कि यह टिप केवल Befunge-98 और बाद में लागू होता है। Befunge के पुराने संस्करणों में qनिर्देश का एक अलग फ़ंक्शन (कतार मोड) था या समर्थित नहीं था।
जेम्स होल्डरनेस

3

Befunge-93 में, चरित्र इनपुट कमांड ( ~) को अक्सर -1 के लिए शॉर्टकट के रूप में इस्तेमाल किया जा सकता है, क्योंकि यह वह मूल्य है जो ईओएफ पर लौटाता है।

एक उदाहरण के रूप में, नीचे दिए गए कोड -1 का उत्पादन होगा:

~.@

इसे ऑनलाइन आज़माएं!

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

उस ने कहा, PPCG पर नियम यह है कि एक प्रोग्राम एक खाली इनपुट स्ट्रीम मान सकता है , और यह है कि यह आमतौर पर TIO पर कैसे चलाया जाएगा ।

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


2

आईपी की दिशा का प्रयोग करें जब से निपटने _या |के बजाय, के लिए एक अतिरिक्त चरित्र का उपयोग कर !

वास्तविक उदाहरण ( इस पोस्ट से ):

#v~
,>:!#@_

को बदला जा सकता है

#v~
:<,_@#

2

मत भूलो कि 0kअगले निर्देश को निष्पादित नहीं करता है। इसका मतलब है कि करने के बजाय:

;some boolean test;!jv;code if false;
       ;code if true;<

आप एक चरित्र को बचाकर कर सकते हैं

;some boolean test;kv;code if false;
      ;code if true;<

ध्यान दें कि यह टिप केवल Befunge-98 और बाद में लागू होता है। Befunge के पहले संस्करणों ने kनिर्देश का समर्थन नहीं किया था ।
जेम्स होल्डरनेस

1

kऑपरेटर के बारे में मत भूलना । इसके बजाय "!dlroW olleH",,,,,,,,,,,,@, करो "!dlroW olleH"bk,@। ध्यान दें कि kआपरेशन करता है सेल यह है कि कम से पर तो 9k,नहीं लेकिन 9 बार 10 प्रिंट होगा; 9 बार के साथ k, और एक बार के साथ ,


1
ध्यान दें कि यह टिप केवल Befunge-98 और बाद में लागू होता है। Befunge के पहले संस्करणों ने kनिर्देश का समर्थन नहीं किया था ।
जेम्स होल्डरनेस

1

स्टैक पर छोटी संख्या को धकेलने पर, आप संभवतः आसानी से समझ सकते हैं कि 45*आपको मिलेगा 20, और 67*आपको मिलेगा 42। जब यह बड़ी संख्या में आता है, हालांकि, आपको वास्तव में एक कार्यक्रम की आवश्यकता होती है जो आपके लिए सबसे कुशल प्रतिनिधित्व की गणना कर सकता है।

इसके लिए सबसे आसान विकल्प BefunRep के लिए माइक श्वॉयर का ऑनलाइन इंटरफ़ेस है । आप बस एक संख्या में टाइप करते हैं और यह एक बराबर Befunge प्रतिनिधित्व को थूक देगा। यह हमेशा सबसे इष्टतम नहीं होता है, लेकिन यह काफी करीब है, और यह आपके हाथ से आने वाली किसी भी चीज़ से बेहतर होना लगभग निश्चित है।

ऑनलाइन सिस्टम 0 से 16777215 तक की संख्या में सीमित है, इसलिए यदि आपको इससे बड़ी कोई चीज चाहिए, तो आप स्टैंडअलोन BefunRep उपयोगिता डाउनलोड कर सकते हैं और गणना स्वयं चलाना चाहेंगे

यदि आप Befunge-98 में प्रोग्रामिंग कर रहे हैं, तो विचार करने का एक और विकल्प फंगिफ़ है । सामान्य तौर पर यह लगभग BefunRep के रूप में इष्टतम नहीं है, लेकिन कुछ कम संख्याओं के लिए, जहां हेक्स अंक और एकल उद्धरण वर्ण सबसे प्रभावी हैं, यह कभी-कभी बेहतर परिणाम दे सकता है।


Befunge 98 में छोटी संख्या को आगे बढ़ाने पर, आप उपयोग करेंगे '। उदाहरण के लिए 42:'*
जस्टिन

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