कॉम्पैक्ट एक Befunge प्रोग्राम


17

Befunge एक 2-आयामी गूढ़ प्रोग्रामिंग भाषा है। मूल विचार यह है कि (एक-चरित्र) कमांड को 2-आयामी ग्रिड पर रखा गया है। नियंत्रण प्रवाह ग्रिड के पार चलता है, कमांड को निष्पादित करता है जो इसे पार करता है, और दिशा बदलता है जब यह एक तीर मारता है ( >^<v)। कमांड स्टैक-आधारित हैं; इस सूची को देखें । Http://esolangs.org/wiki/Befunge भी देखें ।

Befunge-98 के लिए विनिर्देश उपलब्ध है।

मुसीबत

एक प्रोग्राम लिखें जो एक Befunge प्रोग्राम को अधिक कॉम्पैक्ट प्रतिनिधित्व में बदल देता है। उदाहरण के लिए, निम्नलिखित प्रोग्राम प्रिंट करता है 0:

>   0   v

>   @   .

^       <

इस मामले में, इसे देने के लिए रिक्त स्थान की पंक्तियों को हटाकर कार्यक्रम के व्यवहार को बदलने के बिना कॉम्पैक्ट किया जा सकता है

>0v
>@.
^ <

अधिक परिष्कृत रूपांतरों को कमांड के दर्पण अनुक्रमों को घुमा या मिरर कर सकते हैं और प्रोग्राम को कॉम्पैक्ट करने के लिए अनावश्यक नियंत्रण-प्रवाह आदेशों को समाप्त कर सकते हैं। उदाहरण के लिए, इस कार्यक्रम के साथ:

>12345v
      6
v....7<
.
.
.
@

आप कार्यक्रम के अंत में छेद में टक सकते हैं:

>12345v
>...@ 6
^....7<

पहले उदाहरण के लिए, सबसे कॉम्पैक्ट कार्यक्रम संभव है

>0.@

आप किसी भी परिवर्तन का उपयोग तब तक कर सकते हैं जब तक आउटपुट प्रोग्राम समान परिणाम नहीं देता।

इनपुट प्रोग्राम

इनपुट प्रोग्राम वैध Befunge-98 प्रोग्राम हैं।

आप मान सकते हैं कि इनपुट प्रोग्राम निर्धारक है। यही है, यह बाहरी राज्य को पढ़ने वाले आदेशों का उपयोग नहीं करता है: उपयोगकर्ता इनपुट कमांड &और ~, रैंडमाइज़र ?, और स्वयं-संशोधित कोड कमांड pऔर g

आप मान सकते हैं कि इनपुट प्रोग्राम समाप्त हो गया है।

स्कोरिंग

यह एक कोड गोल्फ नहीं है, लेकिन एक प्रोग्राम लिखने के लिए एक समस्या है जो कोड गोल्फिंग करती है।

इनपुट परीक्षण मामलों का एक सेट है (Befunge प्रोग्राम जो ऊपर दिए गए इनपुट प्रतिबंधों को पूरा करते हैं)। कुल स्कोर परीक्षण मामलों के लिए अंकों का योग है।

प्रत्येक परीक्षण मामले के लिए स्कोर

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

>   v
 @  <

9.5 का स्कोर मिलता है।

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

यदि आपके प्रोग्राम के साथ प्रसंस्करण के बाद टेस्ट-केस प्रोग्राम का एक अलग परिणाम है (या समाप्त करने में विफल रहता है), स्कोर इनपुट प्रोग्राम का स्कोर है और साथ ही 100 अंकों का जुर्माना है।


8
उसी आउटपुट को प्रिंट करने वाले Befunge प्रोग्राम को पूरा करने और लिखने के लिए प्रोग्राम को चलाने से रोकने के लिए क्या है?
कीथ रान्डेल

5
क्या "प्राप्त" और "पुट" की अनुमति है? यदि आप "पुट" (स्व-संशोधित कोड) की अनुमति देते हैं, तो कुछ भी करना मुश्किल होगा।
कीथ रान्डेल

2
निष्पादन कहाँ से शुरू होता है? ऊपरी बायां कोना? यदि हां, तो क्या आप दूसरे उदाहरण के आउटपुट की व्याख्या कर सकते हैं? .आउटपुट पूर्णांक का अर्थ है, लेकिन यदि आप शीर्ष बाएं से शुरू करते हैं, तो स्टैक में आउटपुट में पूर्णांक नहीं है।
13

1
@ जेलसर हाँ, .एक पूर्णांक आउटपुट करता है। लेकिन यह भी, जब स्टैक पर पर्याप्त पैरामीटर नहीं हैं, तो दिखावा करें कि वहां पर्याप्त मात्रा में शून्य है। तो दूसरा उदाहरण आउटपुट होगा 000
डेनियरो

@KeithRandall: एक ही आउटपुट के साथ एक नया प्रोग्राम लिखना केवल थोड़े आउटपुट वाले कार्यक्रमों के लिए काम करता है। gऔर pअनुमति नहीं है (क्षमा करें, उन लोगों के बारे में भूल गए; संपादित)।
यांत्रिक घोंघा

जवाबों:


12

मैंने एक लंबी प्लेन राइड को इस एक कोडिंग में बिताया। मैंने एक छद्म befunge संकलक लिखा है जो befunge प्रोग्राम चलाता है, बुनियादी ब्लॉक निकालता है, और उन्हें एक कॉम्पैक्ट प्रतिनिधित्व में देता है।

कार्यक्रम का लिंक

जब इस 99 बोतल कार्यक्रम पर चला:

92+9*                           :. v  <
>v"bottles of beer on the wall"+910<
,:
^_ $                             :.v
            >v"bottles of beer"+910<
            ,:
            ^_ $                     v
>v"Take one down, pass it around"+910<
,:
^_ $                           1-v
                                 :
        >v"bottles of beer"+910.:_          v
        ,:
        ^_ $                          ^
                    >v" no more beer..."+910<
                    ,:
                    ^_ $$ @

यह निम्न आउटपुट उत्पन्न करता है:

92+9*:.019+"llaw eht no "v
v  _v# :"bottles of beer"<
>    ,:    v
^  _v#     <
    >$:.019+"reeb f"v
 v _  v#:"bottles o"<
 >     ,:  v
 ^ _  v#   <
      >$019+"dnuo"v
     v"pass it ar"<
     >" ,nwod eno"v
 v _    v#:"Take "<
 >       ,:v
 ^ _    v# <
        >$1-:v
 v _      v# <
 >         :.019+"reeb "v
  v_  v#   :"bottles of"<
  >        ,v
  ^_  v#   :<
      >    $019+"llaw"v
           v" on the "<
           >"reeb fo "v
^  _^#      :"bottles"<
          >019+"...r"v
v  _v#:" no more bee"<
>    ,:    v
^  _v#     <
    >$$@    

यह वास्तव में स्रोत की तुलना में बहुत अधिक कॉम्पैक्ट नहीं है, लेकिन यह संभवतः बड़े / विरल कार्यक्रमों पर बेहतर करेगा।

कार्यक्रम को बाईं ओर एक रूटिंग क्षेत्र और दाईं ओर बुनियादी ब्लॉक सामग्री के साथ रखा गया है। एक बुनियादी ब्लॉक को आमतौर पर एक समान संख्या में पंक्तियों में रखा जाता है ताकि प्रवेश मार्ग से बाहर निकलें और बाहर निकलें। प्रत्येक मूल ब्लॉक के अंत में, गैजेट #^_vऔर वेरिएंट, दाएं-से-बाएं रखे गए, सशर्त शाखा और मार्ग प्रवाह को कॉलम में करते हैं। प्रत्येक मूल ब्लॉक की शुरुआत में, ये कॉलम गंतव्य मूल ब्लॉक के लिए पंक्तियों में रूट किए जाते हैं।

इसके अलावा, यदि आउटपुट कम है तो यह आउटपुट को स्पष्ट रूप से उत्पन्न करता है, जैसे:

"output">:#,_@

मैंने कुछ भी नहीं किया है खुद को बुनियादी ब्लॉकों को अनुकूलित करने के लिए, केवल लेआउट। करने के लिए।

तो परीक्षण कहाँ हैं?


1
स्रोत कोड लिंक अभी 500 लगता है। सर्वर ग़लतफ़हमी?
जॉन ड्वोरक

1
@JDDvorak: वास्तव में। फिक्स्ड।
कीथ रान्डेल

1

सैड, 5 चार्ट

इसलिए, भले ही यह कोडगॉल्फ नहीं है, यहां एक समाधान है जिसमें स्कोर करने के लिए अनुपात अच्छा होगा, लेकिन जरूरी नहीं कि यह एक अच्छा स्कोर हो।

/^$/d

यह बस खाली लाइनों को हटा देता है।


10
आपका कोड सही नहीं है! आप केवल खाली लाइनें नहीं निकाल सकते। मैं टिप्पणी में 2d कोड नहीं लिख सकता। लेकिन एक मामले पर विचार करें जो दिशा नीचे की ओर है, और एक निरंतर स्ट्रिंग शुरू हो गई है ( ")। रास्ते में हर खाली लाइन को स्पेस कैरेक्टर के रूप में माना जाना चाहिए। यदि हम उस स्ट्रिंग का प्रिंट आउट लेते हैं, तो आपके द्वारा उत्पन्न कोड आउटपुट में वह स्थान नहीं है!
saeedn

3
Ideone.com/BdcRcf में कोड को देखें इसे प्रिंट करना चाहिए b a। लेकिन आपके छोटा होने के बाद, यह प्रिंट होगा ba
सईदीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.