Getters 받기


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;.
  • getterssetters( 참조 보너스를 그룹화해야 함) 모든 변수 선언 후 와야합니다.

예:

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

B : 당신의 프로그램은 또한 다음을 생성합니다 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
이것은 내 첫 번째 질문입니다. 너무 어렵지 않은 질문입니다. 너가 좋아하길 바래. 샌드 박스 에 유용한 팁을 준 Martin Büttner 에게 감사합니다 .
insertusername 여기

입력 당 하나의 클래스 만 있습니까?
코너 O'Brien

2
보너스 모두 지원할 때 AB게터 있어야 항목 있지만 세터는 세터 출력이?
FryAmTheEggman

1
@FryAmTheEggman 아주 좋은 질문입니다. 보너스 B의 경우 입력이 완료되었다고 가정 할 수 있으므로 게터가 있으면 세터도 있습니다.
insertusername 여기

2
어떤 언어에서는 참조 할 수 있습니다 thisA의 static접근?
Neil

답변:


12

Perl, 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
당신은 Pyth 답변 o_o kudos를 이겼습니다!
코너 O'Brien

9

Pyth, 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 ...
Tschallacka

5

JavaScript ES6 (현재), 305 289223-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과를 (.
apillers

@apsillers 좋은 지적입니다. 두 번째 제안을하려고했지만 시간이 없었습니다. 골프 주셔서 감사합니다! ^ _ ^
Conor O'Brien

2
public|private정규식에 2 바이트를 절약 할 수 있다고 생각합니다 !
Dom Hastings

3

CJam, 71 바이트

q';/W<_{S%W=:O(eu"public function get"\@"{return this->"O";}"}%\';f+\'}

CJam 통역사 에서 온라인으로 사용해보십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.