गेटर्स प्राप्त करें


13

काम

मुझे लगता है कि हर कोई काम के दौरान कुछ समय के लिए स्वचालित कोड पीढ़ी और बचत से प्यार करता है। आपको दिन के दौरान बहुत सारी कक्षाएं और सदस्य बनाने हैं और आप उन सभी को gettersमैन्युअल रूप से नहीं बनाना चाहते हैं ।

कार्य एक प्रोग्राम या फ़ंक्शन लिखना है, जो आपके gettersलिए सभी वर्ग सदस्यों के लिए स्वचालित रूप से उत्पन्न करता है ।


इनपुट

हमारी भाषा में वस्तुएं बहुत सरल हैं। वर्गों और सदस्यों के नामों को एक वर्णमाला से शुरू करना चाहिए [a-zA-Z]और इसमें केवल अक्षर हो सकते हैं [a-zA-Z0-9]। यहाँ एक उदाहरण है:

class Stack {
    public overflow;
    protected trace;
    private errorReport;
}

उत्पादन

यह दिए गए उदाहरण के आधार पर एक मान्य आउटपुट है:

class Stack {
    public overflow;
    protected trace;
    private errorReport;

    public function getOverflow() {
        return this->overflow;
    }

    public function getTrace() {
        return this->trace;
    }

    public function getErrorReport() {
        return this->errorReport;
    }
}

द गटर

एक getterविधि की आवश्यकताएं हैं:

  • समारोह का नाम getसदस्य के नाम के साथ आरंभिक अपरकेस के साथ शुरू होना चाहिए ।
  • फ़ंक्शन का कोई पैरामीटर नहीं है।
  • एक चर उपयोग लौटने के लिए return this->memberName;
  • gettersऔर setters( बोनस को देखें ) समूहीकृत किया जाना चाहिए और सभी चर घोषणाओं के बाद आना चाहिए।

उदाहरण:

private value1;
private value2;

public function getValue1() { return this->value; }
public function setValue1(value) { this->value = value; }

public function getValue2() { return this->value; }
public function setValue2(value) { this->value = value; }

आवश्यकताएँ

  • एक कार्यक्रम या एक समारोह बनाएँ।
  • इनपुट STDIN, कमांड लाइन तर्क, फ़ंक्शन तर्क, एक फ़ाइल आदि से आ सकता है।
  • कोई भी आउटपुट फॉर्मेट एक साधारण-से returnफाइल से या STDOUT से लिखने के लिए स्वीकार्य है ।
  • इन-और आउटपुट को व्हॉट्सएप, न्यूलाइन, टैब आदि के साथ फॉर्मेट करने की आवश्यकता नहीं है। यह एक वैध इनपुट है class A{protected a;}:।
  • आप यह मान सकते हैं कि इनपुट वैध है और आपका प्रोग्राम अप्रत्याशित इनपुट को अप्रत्याशित रूप से भी संभाल सकता है।

बोनस

आप प्रत्येक सुविधा के लिए 30% की निकासी करके अपनी मूल बाइट गिनती के 10% तक प्राप्त कर सकते हैं:

A: आपका कार्यक्रम नए जोड़े गए चर को संबोधित कर सकता है और gettersकेवल ( public function getB() { return this->b; }इस मामले में) गायब है :

class A {
    public a;
    public b;

    public function getA() { return this->a; }
}

बी: आपका कार्यक्रम भी उत्पन्न करता है setters:

class A {
    public a;
    public getA() { return this->a; }
    public setA(a) { this->a = a; }
}

C: आपका प्रोग्राम स्थैतिक सदस्यों को संभाल सकता है:

class A {
    public static c;
    public static function getC() { return this->c; }
}

यह कोड गोल्फ है - बाइट्स जीत में इतना कम जवाब। मानक खामियों को अस्वीकार कर दिया जाता है।


3
यह मेरा पहला प्रश्न है - बहुत कठिन नहीं है। उम्मीद है आप इसे पसंद करते हैं। सैंडबॉक्स में उपयोगी सुझावों के लिए मार्टिन ब्यूटनर को धन्यवाद ।
15

क्या प्रति इनपुट केवल एक वर्ग होगा?
कॉनर ओ'ब्रायन

2
जब दोनों बोनस का समर्थन करना चाहिए Aऔर Bउन वस्तुओं को प्राप्त करना चाहिए जिनके पास गेटर्स हैं, लेकिन कोई बसने वाला नहीं है, तो आउटपुट में बसता है?
फ्राईअमईएग्गमैन

1
@FryAmTheEggman यह एक बहुत अच्छा सवाल है। मैं कहूंगा कि बोनस बी के लिए आप मान सकते हैं कि इनपुट पूरा हो गया है, इसलिए अगर कोई गेट्टर है तो एक सेटर भी है।
निवसुर्नमेर्इ

2
आपको किस भाषा thisमें एक staticएक्सेसर में संदर्भित करने की अनुमति है ?
नील

जवाबों:


12

पर्ल, 161 - 90% = 16.1 बाइट्स

$/=0;$_=<>;for$g(/\bp\S*( +static)? +(\S*);/g){++$i%2?$c="public$g function":/get\u$g/||s/}$/$c get\u$g(){return this->$g;}\n$c set\u$g(x){this->$g=x;}\n}/}print

5
आपने पायथ उत्तर को हराया O_o यश!
कॉनर ओ'ब्रायन

9

पायथ, 198 बाइट्स - 90% = 19.8 बाइट्स 187 - 90% = 18.7 बाइट्स 183 बाइट्स - 90% = 18.3 बाइट्स

pJ<rs.z6_1sm?}+=b"get"K+rh=Zed1tZJks[Y=N|@d1kGbK"(){return "=H+"this->"Z";}"YNG"set"K"(x){"H"=x;}"):Js["(?:(?:"=Y"public""|private|protected)(?!"=G" function "")( static)?) (\w+)")4\}

चाहिए ... हरा ... पर्ल ...

187-बाइट / 18.7-बाइट संस्करण

J<rs.z6_1s_+\},sm?}+=b"get"K+rh=Zed1tZJks[Y=N|@d1kGbK"(){return "=H+"this->"Z";}"YNG"set"K"(x){"H"=x;}"):Js["(?:(?:"=Y"public""|private|protected)(?!"=G" function "")( static)?) (\w+)")4J

198-बाइट / 19.8-बाइट संस्करण

J<rs.z6_1s_,sm?}K+rhed1tedJks["public"=N|@d1k=G" function ""get"K"(){return this->"ed";}public"NG"set"K"("ed"){this->"ed"="ed";}"):J"(?:(?:public|private|protected)(?! function )( static)?) (\w+)"4J

TODO: अधिक गोल्फ!


3
+1 के लिए मोती को हराना चाहिए ...
शचीलका

5

जावास्क्रिप्ट ईएस 6 (फिलहाल), 305 289 223 - 60% = 89.2 बाइट्स

था 256 - 30% = 179.2 bytes

स्थिर और सेटर बोनस के लिए योग्य है; अब अतिरिक्त ES6 के साथ!

s=>s.replace(/\}$/,s.match(/(public|private)( static)* \w+/g).map(e=>{o=(r=e.split` `).pop();return(n=r.join` `)+` get${U=o[0].toUpperCase()+o.slice(1)}(){return this->${o};}${n} set${U}(${o}){this->${o}=${o};}`}).join``+"}")

ES5 फ़ंक्शन, 115.6 बाइट्स

function g(s){return s.replace(/\}$/,s.match(/(p(?:ublic|rivate))( static)* (\w+?);/gm).map(function(e){o=(r=e.split(" ")).pop().replace(/;/,"");return(n=r.join(" "))+" get"+(U=o[0].toUpperCase()+o.slice(1))+"(){return this->"+o+";}"+n+" set"+U+"("+o+"){this->"+o+"="+o+";}"}).join("")+"}")}

1
मुझे लगता है कि आपको o.slice(1,o.length))बस छोटा किया जा सकता है o.slice(1)), और मुझे लगता है कि आप इनलाइन कर सकते हैं v, क्योंकि आप केवल एक बार इसका उपयोग करते हैं (यानी, अपने फ़ंक्शन को इसके साथ शुरू करें return s.replace(/\}$/, s.match(...).map...)। इसके अलावा, मुझे विश्वास नहीं है कि आपको returnऔर के बीच एक स्थान की आवश्यकता है (
अप्सिलर्स

@ नलकूप अच्छी बात है। मैं दूसरा सुझाव देने जा रहा था, लेकिन मेरे पास समय नहीं था। अपने गोल्फ के लिए धन्यवाद! ^ _ ^
कॉनर ओ'ब्रायन

2
मुझे लगता है कि आप public|privateअपने regex में सिर्फ 2 बाइट्स बचा सकते हैं !
डोम हेस्टिंग्स

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