Nhận Getters


13

Nhiệm vụ

Tôi đoán mọi người đều thích tạo mã tự động và tiết kiệm thời gian trong khi làm việc. Bạn phải tạo ra rất nhiều lớp học và thành viên trong ngày và bạn không muốn tạo tất cả những thứ đó một getterscách thủ công.

Nhiệm vụ là viết một chương trình hoặc hàm, getterstự động tạo cho tất cả các thành viên lớp cho bạn.


Đầu vào

Trong các đối tượng ngôn ngữ của chúng tôi rất đơn giản. Tên của các lớp và thành viên phải bắt đầu bằng một chararacter từ [a-zA-Z]và chỉ có thể chứa các ký tự [a-zA-Z0-9]. Đây là một ví dụ:

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

Đầu ra

Đây là một đầu ra hợp lệ dựa trên ví dụ đã cho:

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

Các yêu cầu cho một getterphương pháp là:

  • Tên hàm phải bắt đầu bằng gettheo sau là tên thành viên với chữ hoa viết tắt.
  • Hàm không có tham số.
  • Để trả về một sử dụng biến return this->memberName;.
  • getterssetters( xem Phần thưởng ) phải được nhóm lại và phải đến sau tất cả các khai báo biến.

Thí dụ:

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

Những yêu cầu

  • Tạo một chương trình hoặc một chức năng.
  • Đầu vào có thể đến từ STDIN, đối số dòng lệnh, đối số chức năng, tệp, v.v.
  • Bất kỳ định dạng đầu ra nào cũng được chấp nhận từ giá returntrị đơn giản thành tệp hoặc ghi vào STDOUT.
  • Đầu vào và đầu ra không cần phải được định dạng bằng khoảng trắng, dòng mới, tab, v.v ... Đây là một đầu vào hợp lệ : class A{protected a;}.
  • Bạn có thể cho rằng đầu vào là hợp lệ và chương trình của bạn cũng có thể xử lý đầu vào bất ngờ.

Tiền thưởng

Bạn có thể nhận được tới 10% số byte ban đầu của mình bằng cách rút 30% cho mỗi tính năng:

Trả lời: Chương trình của bạn có thể giải quyết các biến mới được thêm và chỉ thêm thiếu getters( public function getB() { return this->b; }trong trường hợp này):

class A {
    public a;
    public b;

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

B: Chương trình của bạn cũng tạo ra setters:

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

C: Chương trình của bạn có thể xử lý các thành viên tĩnh:

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

Đây là mã golf - vì vậy câu trả lời ngắn nhất trong byte thắng. Sơ hở tiêu chuẩn là không được phép.


3
Đây là câu hỏi đầu tiên của tôi - một câu hỏi không quá khó. Hy vọng bạn thích nó. Cảm ơn Martin Büttner vì những lời khuyên hữu ích trong Sandbox .
insertusernamehere

Sẽ chỉ có một lớp cho mỗi đầu vào?
Conor O'Brien

2
Khi hỗ trợ cả phần thưởng ABcác mục có getters, nhưng không có setters, có setters trong đầu ra không?
FryAmTheEggman

1
@FryAmTheEggman Đó là một câu hỏi rất hay. Tôi sẽ nói rằng đối với phần thưởng B, bạn có thể giả sử rằng đầu vào đã hoàn thành, vì vậy nếu có một getter thì cũng có một setter.
insertusernamehere

2
Trong ngôn ngữ nào bạn được phép đề cập đến thistrong một người truy cập static?
Neil

Câu trả lời:


12

Perl, 161 - 90% = 16,1 byte

$/=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
Bạn đánh bại câu trả lời Pyth o_o kudos!
Conor O'Brien

9

Pyth, 198 byte - 90% = 19,8 byte 187 - 90% = 18,7 byte 183 byte - 90% = 18,3 byte

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

Phải ... đánh ... Perl ...

Phiên bản 187 byte / 18,7 byte

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

Phiên bản 198 byte / 19,8 byte

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: Chơi gôn nhiều hơn!


3
+1 cho Phải đánh bại ngọc trai ...
Tschallacka

5

JavaScript ES6 (tại thời điểm này), 305 289 223 - 60% = 89,2 byte

Đã 256 - 30% = 179.2 bytes

Đủ điều kiện nhận thưởng tĩnh và setter; bây giờ có thêm 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``+"}")

Hàm ES5, 115,6 byte

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
Tôi nghĩ o.slice(1,o.length))đơn giản là có thể rút ngắn o.slice(1))và tôi nghĩ bạn có thể nội tuyến v, vì bạn chỉ sử dụng nó một lần (nghĩa là bắt đầu chức năng của bạn với return s.replace(/\}$/, s.match(...).map...). Ngoài ra, tôi không tin rằng bạn cần một không gian giữa return(.
apsillers

@apsillers Điểm tốt. Tôi sẽ thực hiện gợi ý thứ hai, nhưng đơn giản là tôi không có thời gian. Cảm ơn các golf của bạn! ^ _ ^
Conor O'Brien

2
Tôi nghĩ bạn có thể tiết kiệm 2 byte chỉ public|privatetrong regex của mình!
Dom Hastings

3

CJam, 71 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.