तीसरा फ्लैक!


19

यह चुनौती अप्रैल 2018 लोटम चैलेंज के हिस्से के रूप में पोस्ट की गई थी


ब्रेन-फ्लैक एक ट्यूरिंग-टार्पिट भाषा है, जिसने पीपीसीजी पर यहां काफी ख्याति प्राप्त की है। भाषा की स्मृति दो ढेर द्वारा रचित है, लेकिन एक "छिपा" तीसरी ढेर की खोज की थी द्वारा Wh जादूगर पर , यह सोच कर ब्रेन-आलोचना कार्यक्रमों में से कुछ दिलचस्प नए तरीके के लिए अग्रणी।

तो, उस गरीब छिपे हुए तीसरे स्टैक को अधिक दृश्यता देने के बारे में क्या? आइए एक भाषा बनाएं जहां तीसरे स्टैक की मान्यता है जो इसके योग्य है! यहाँ मैं आपको थर्ड-फ्लैक प्रस्तुत करता हूँ ।

भाषा

थर्ड-फ्लैक में केवल एक स्टैक होता है, जिसे तीसरा स्टैक कहा जाता है। ऑपरेटर्स उसी तरह वे ब्रेन-आलोचना में क्या में तीसरे ढेर पर काम करते हैं, लेकिन यहां कोई नहीं है [], {}, <>nilads और कोई {...}इकाई (ताकि किसी तृतीय-आलोचना कार्यक्रम में केवल स्वीकार्य चरित्र ()[]<>)। यहां प्रत्येक ऑपरेटर करता है (उदाहरणों को एक सूची के साथ तीसरे स्टैक का प्रतिनिधित्व किया जाएगा जहां अंतिम तत्व स्टैक के शीर्ष है):

  • ()थर्ड-फ्लैक में केवल दो-वर्ण ऑपरेटर है। यह 1. स्टैक द्वारा तीसरे स्टैक के शीर्ष को बढ़ाता है: [1,2,3][1,2,4]

  • (, [, <: सभी उद्घाटन कोष्ठकों कि पिछले मामले में शामिल नहीं हैं एक धक्का 0तीसरे ढेर करने के लिए। उदाहरण: [1,2,3][1,2,3,0]

  • )तीसरे स्टैक से दो तत्वों को पॉप करता है और उनकी राशि को वापस धकेलता है। उदाहरण: [1,2,3][1,5]

  • ]तीसरे स्टैक से दो तत्वों को पॉप करता है और पहले को दूसरे से घटाने का नतीजा पीछे धकेलता है। उदाहरण: [1,2,3][1,-1]

  • >तीसरे स्टैक से एक तत्व पॉप करता है। उदाहरण [1,2,3][1,2]

और यहाँ भाषा के अन्य नियम हैं:

  • निष्पादन की शुरुआत में तीसरे स्टैक में केवल एक 0 होता है।

  • किसी प्रोग्राम के खाली होने []या उसके <>अंदर जाने की मनाही है (यदि वे फ़्लॉप-थ्रैक के शब्दार्थ का अनुसरण करते हैं, तो वैसे भी कोई फ़ोकस नहीं होगा, लेकिन उनका वास्तव में ब्रेन-फ़्लैक में एक अलग अर्थ है जो यहां फिर से बनाना संभव नहीं है)।

  • कोष्ठक को हमेशा संतुलित करने की आवश्यकता होती है, इस तथ्य को छोड़कर कि कार्यक्रम के अंत में कोष्ठक को पीछे छोड़ना गायब हो सकता है। एक उदाहरण के रूप में, [()<(()एक मान्य थर्ड-फ्लैक प्रोग्राम है (और प्रोग्राम के अंत में तीसरा स्टैक होगा [1,0,1])।

  • एक कार्यक्रम में केवल छह अनुमत वर्ण शामिल हो सकते हैं ()[]<>। कार्यक्रम गैर-रिक्त होने की गारंटी है।

नोट: यह पिछले नियमों से निहित है कि आपको उन स्थितियों से नहीं निपटना होगा जहां आपको खाली स्टैक से पॉप करने की आवश्यकता होती है।

चुनौती

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

आपका आउटपुट फॉर्मेट तब तक लचीला होता है जब तक कि उसे तीसरे स्टैक की स्थिति से स्पष्ट रूप से पढ़ना संभव न हो और एक ही नंबर हमेशा एक ही तरीके से एनकोड किया जाता है (यह सिर्फ कहने का एक तरीका है कि कोई भी आउटपुट फॉर्मेट एक ज़बरदस्त तरीका नहीं है धोखा देने की कोशिश करना ठीक है)।

आपकी आउटपुट पसंद उन संख्याओं की सीमा को सीमित कर सकती है जिन्हें आप प्रबंधित कर सकते हैं क्योंकि यह चुनौती को तुच्छ नहीं बनाता है (क्योंकि यह एक डिफ़ॉल्ट कमियां होगी )।

परीक्षण के मामलों

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

[()<(()
0 1 0 1

[((((()()()()()))
0 0 0 5

((([()][()][()])))
-3

[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0

[()]<(([()])><[()]
-1 0 -1

(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2

क्या स्टैक 0 से आरंभ किया गया है? अन्यथा [()]नियम है कि हम एक खाली ढेर से पॉपिंग के बारे में चिंता करने की जरूरत नहीं है
जो किंग

1
@JoKing Yep: "निष्पादन की शुरुआत में तीसरे स्टैक में केवल एक 0 होता है"। शायद मुझे उस हिस्से को थोड़ा उजागर करना चाहिए, मुझे डर था कि इसे याद करना बहुत आसान होगा।
सिंह

उफ़, मुझे नहीं पता कि मैं कैसे चूक गया
जो किंग

7
क्रास आउट ई अभी भी ई है।
गेहूं जादूगर

2
अगर किसी को यह नहीं दिख रहा है, तो यहां से पार हो गया eहै ।
user202729

जवाबों:



4

रेटिना 0.8.2 , 64 48 46 बाइट्स

\(\)
_
[([<]
¶
+1`¶(.*)\)|(.*)¶\2]|¶.*>
$1
%`_

इसे ऑनलाइन आज़माएं! स्टैक को नीचे से ऊपर तक आउटपुट देता है। केवल गैर-नकारात्मक पूर्णांक के साथ काम करता है, और अंतिम परीक्षण का मामला बहुत धीमा है, इसलिए लिंक में केवल तीन परीक्षण मामले शामिल हैं। स्पष्टीकरण: स्टैक स्पष्ट रूप से कार्यक्रम से पहले आता है, इसलिए यह खाली स्ट्रिंग के रूप में शुरू होता है, जो एक एकल शून्य का प्रतिनिधित्व करता है। ()Nilad एक में बदल गया है _, जो एकल में गिनती करने के लिए प्रयोग किया जाता है, जबकि अन्य खुला कोष्ठक नई पंक्तियां जो ढेर के रूप में वे का सामना करना पड़ा कर रहे हैं पर एक शून्य धक्का में बदल रहे हैं। करीब कोष्ठक को एक समय में एक संसाधित किया जाता है ताकि स्टैक सही हो जाए; )पिछली नई पंक्ति को हटाता है, शीर्ष दो तत्वों को एक साथ जोड़ता है, ]शीर्ष तत्व को हटाता है और पिछले तत्व से मिलान करता है इस प्रकार इसे घटाता है और शीर्ष>बस शीर्ष तत्व को हटाता है। अंत में स्टैक को दशमलव में बदल दिया जाता है। संपादित करें: @Leo के लिए 2 बाइट्स सहेजे गए।


किस $3लिए है? (महान जवाब, वैसे भी!)
सिंह

@Leo यह एक पिछले गोल्फ से बचा हुआ है। इसे जगह देने के लिए धन्यवाद!
नील

4

पायथन 3 , 145 144 132 122 116 109 104 बाइट्स

-7 बाइट्स लियो को धन्यवाद!

और - लिन को 5 धन्यवाद!

s=[0]
for i in input().replace('()',' '):s+=i in']>) 'and(i<'!'or(2-ord(i)%5)*s.pop())+s.pop(),
print(s)

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

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

वन-लाइनर्स के कुछ प्रयास:

  • 124 बाइट्स (अनाम फ़ंक्शन):

    lambda c:[s.append(i in']>) 'and(i<'!'or~-']>)'.index(i)*s.pop())+s.pop())or s for s in[[0]]for i in c.replace('()',' ')][0]
  • 115 बाइट्स (पूरा कार्यक्रम):

    s=[0];[s.append(i in']>) 'and(i<'!'or~-']>)'.index(i)*s.pop())+s.pop())for i in input().replace('()',' ')];print(s)

सादे कार्य की तुलना में एपेंड अधिक लंबा है


~-']>)'.index(i)(2-ord(i)%5)4 बाइट बचाने के लिए किया जा सकता है।
लिन

2

रूबी , 98 91 बाइट्स

->s{a=[i=0];s.chars{|c|a<<("([<"[c]?s[i,2]["()"]?1:0:a.pop*~-"]>)".index(c)+a.pop);i+=1};a}

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

मेरे प्रारंभिक कोड ने जो राजा के पायथन उत्तर की भावना के अनुरूप काम किया, ताकि स्रोत वर्णों के माध्यम से लूप करने से पहले हमने ()एक अलग ऑपरेटर के रूप में सभी सब्सट्रिंग्स को एक और चरित्र द्वारा बदल दिया ।

हालांकि, कम से कम रूबी में, यह नहीं करने के लिए गोल्फर निकला, बल्कि थोड़ा अधिक बोझिल दृष्टिकोण के लिए जाना। यहां, हम iस्रोत स्ट्रिंग में अपनी स्थिति का ट्रैक रखते हुए एक अतिरिक्त इंडेक्सर बनाए रखते हैं, और जब भी एक ओपनिंग ब्रैकेट का सामना करना पड़ता है, तो हम एक लुकहैड की जाँच करते हैं कि क्या हमारा वर्तमान + अगला चार्ट ऑपरेटर s[i,2]बनाता है ()। उस स्थिति में हम स्टैक के शीर्ष पर 0 के बजाय 1 धक्का देते हैं, और समापन )को अगले चरण में अपना काम करने देते हैं।


1

05AB1E , 25 बाइट्स

΄()1:v"0+0\0->"žuykè.V})

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

व्याख्या

Î                           # initialize the stack with 0 and the input
 „()1:                      # replace any occurrence of "()" in the input with 1
      v                }    # for each char y in this string
                žuyk        # get its index in the string "()[]<>{}"
       "0+0\0->"    è       # use this to index into the string "0+0\0->"
                     .V     # eval
                        )   # wrap the stack in a list


1

आर , 182 177 बाइट्स

function(P){for(k in utf8ToInt(gsub("\\(\\)",7,P))%%8){if(k%in%0:4)F=c(0,F)
if(k==7)F[1]=F[1]+1
if(k==1)F=c(F[2]+F[3],F[-3:0])
if(k==5)F=c(F[2]-F[1],F[-2:0])
if(k==6)F=F[-1]}
F}

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

स्टैक लौटाता है, जहाँ स्टैक का शीर्ष पहले है और स्टैक का निचला भाग अंतिम है।

के ()साथ स्वैप 7और फिर अलग-अलग संख्यात्मक मूल्यों को प्राप्त करने के लिए कोड अंक मॉड 8 की गणना करता है, जो स्ट्रिंग्स की तुलना में आसान और गोल्फर हैं।

यह आर में एक वेक्टर की शुरुआत के साथ काम करने के लिए गोल्फर है, इसलिए हम इस तरह से स्टैक का निर्माण करते हैं।

तब यह देखता है ), या जब k==1, यह स्टैक के शीर्ष पर एक अतिरिक्त शून्य जोड़ता है क्योंकि यह इसे जोड़ने और इसे हटाने के लिए गोल्फर है।



1

सीलोन, 285 266 बाइट्स

function f(variable String c){variable Integer[]s=[0];value o=>[s[0]else nothing,s=s.rest][0];void u(Integer i)=>s=[i,*s];while(c!=""){if(c[0:2]=="()"){u(1);c=c.rest;}switch(c[0])case(')'){u(o+o);}case(']'){u(-o+o);}case('>'){noop(o);}else{u(0);}c=c.rest;}return s;}

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

(लियो द्वारा एक सुझाव के कारण 19 बाइट्स बचाए गए।)

प्रारूपित और टिप्पणी की गई:

// Interpreter for ThirdFlak
// Question:    /codegolf//q/163242/2338
// This answer: /codegolf//a/163403/2338
//
// This function takes the code as a string, and returns the value
// of the stack as a sequence of Integers.
function f(variable String c) {
    // stack, in the beginning just a single 0.
    // Top element of the stack is the first, because push + pop is easier this way.
    variable Integer[] s = [0];
    // pop – used like an Integer variable (not a function – this saves the `()`), but has side effects.
    value o =>
        // `s[0]` is the first element of the stack. We tell the compiler
        // that it is non-null (otherwise we'll get an error at run time)
        // using the `else nothing`. `s.rest` is `s` without its first element.
        // Both together are wrapped into a 2-tuple, of which we then take just
        // the first element, to have both together in an expression instead
        // the longer way using an accessor block with a temporary variable and a return.
        // value o {
        //   value r = s[0] else nothing;
        //   s = s.rest;
        //   return r;
        // }
        [s[0] else nothing, s = s.rest][0];
    // push
    void u(Integer i) =>
        // a tuple enumeration, using the spread argument.
        s = [i, *s];
    // the main loop
    while (c != "") {
        if (c[0:2] == "()") {
            // »`()` is the only two-characters operator in Third-Flak. It increases the top of the third stack by 1.«
            // As `)` alone adds the two top elements together, we can just push a one here, and let the handling for `)` do the rest.
            u(1);
            c = c.rest;
        }
        switch (c[0])
        case (')') {
            // »`)` pops two elements from the third stack and pushes back their sum.«
            u(o + o);
        }
        case (']') {
            // »`]` pops two elements from the third stack and pushes back the result of subtracting the first from the second.«
            // As the o written first is the first one, we can't write this as a subtraction.
            u(-o + o);
        }
        case ('>') {
            // »`>` pops an element from the third stack.«
            // `o;` alone is not a valid statement, so we pass it to the `noop` function.
            noop(o);
        }
        else {
            // all other valid code characters are `(`, `[`, `<`, which all just push a 0.
            u(0);
        }
        c = c.rest;
    }
    return s;
}

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


मैं वास्तव में सीलोन को नहीं जानता, लेकिन शायद आप स्विच के पहले मामले को हटा सकते हैं और सभी खुलने वाले कोष्ठकों का प्रबंधन करने के लिए किसी अन्य भाग का उपयोग कर सकते हैं :)
लियो

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