গেটার্স পান


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; }

প্রয়োজনীয়তা

  • একটি প্রোগ্রাম বা একটি ফাংশন তৈরি করুন।
  • এসটিডিআইএন, কমান্ড লাইন আর্গুমেন্ট, ফাংশন আর্গুমেন্ট, একটি ফাইল ইত্যাদি থেকে ইনপুট আসতে পারে
  • যে কোনও আউটপুট ফর্ম্যাট একটি সাধারণ returnমূল্য থেকে একটি ফাইল বা STDOUT এ লেখার পক্ষে গ্রহণযোগ্য ।
  • ইন- এবং আউটপুট সঙ্গে অনুসরণকারী শূণ্যস্থান, নতুন লাইন, ট্যাব ইত্যাদি এটিকে একটি বৈধ ইনপুট ফরম্যাট করা প্রয়োজন না: class A{protected a;}
  • আপনি ধরে নিতে পারেন যে ইনপুটটি বৈধ এবং আপনার প্রোগ্রামটি অপ্রত্যাশিত ইনপুটটি অপ্রত্যাশিতভাবেও পরিচালনা করতে পারে।

বোনাসস

প্রতিটি বৈশিষ্ট্যের জন্য 30% প্রত্যাহার করে আপনি আপনার আসল বাইট গণনার 10% তে নামতে পারেন:

উত্তর: আপনার প্রোগ্রামটি নতুন যুক্ত হওয়া ভেরিয়েবলগুলিকে সম্বোধন করতে পারে এবং 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; }
}

সি: আপনার প্রোগ্রামটি স্থির সদস্যদের পরিচালনা করতে পারে:

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

এটি কোড গল্ফ - তাই বাইট জেতে সংক্ষিপ্ত উত্তর। স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।


3
এটি আমার প্রথম প্রশ্ন - খুব কঠিন নয়। আশা করি এটা আপনার ভালো লেগেছে. ধন্যবাদ মার্টিন Büttner উপযোগী টিপ্স জন্য স্যান্ডবক্স
সন্নিবেশকারী

ইনপুট প্রতি এক শ্রেণি হবে?
কনর ও'ব্রায়েন

2
উভয় বোনাস সমর্থন Aএবং যখন Bআইটেমগুলিতে গেটারগুলি থাকা উচিত, তবে কোনও সেটটার নেই, সেটে আউটপুটটিতে সেটার থাকতে হবে?
FryAmTheEggman

1
@ ফ্রাইআম দ্য এজিগম্যান এটি খুব ভাল প্রশ্ন। আমি বলব যে বোনাস বি এর জন্য আপনি ধরে নিতে পারেন যে ইনপুটটি সম্পূর্ণ, সুতরাং যদি কোনও গেটর থাকে তবে সেটারও রয়েছে।
সন্নিবেশকারী নাম 20

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
আপনি পাইথ উত্তরটি মারলেন!
কনর ও ব্রায়ান

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

টডো: আরও গল্ফিং!


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এবং এর মধ্যে একটি স্থান দরকার (
অ্যাপসিলাররা 12:55

@ অ্যাপ্লায়ার্স ভাল পয়েন্ট। আমি দ্বিতীয় পরামর্শটি করতে যাচ্ছিলাম, তবে আমার কেবল কোনও সময় ছিল না। আপনার গল্ফ জন্য ধন্যবাদ! ^ _ ^
কনার ও'ব্রায়ান

2
আমি মনে করি আপনি কেবলমাত্র public|privateআপনার রেজেেক্সে থাকা 2 বাইট সংরক্ষণ করতে পারবেন !
ডম হেস্টিংস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.