获取吸气剂


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%:

答:您的程序可以处理新添加的变量,并且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
这是我的第一个问题-一个不太难的问题。希望你喜欢。感谢MartinBüttnerSandbox中提供有用的提示。
insertusername此处为2015年

每个输入只会有一个类别吗?
Conor O'Brien 2015年

2
当同时支持的奖金A,并B有干将应该物品,但没有制定者,在输出setter方法?
FryAmTheEggman 2015年

1
@FryAmTheEggman这是一个很好的问题。我想说的是,对于奖金B,您可以假定输入是完整的,因此,如果有一个吸气剂,那么也会有一个二传手。
insertusername此处为2015年

2
允许thisstatic访问器中引用哪种语言?
尼尔

Answers:


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的答案,对不起!
Conor O'Brien 2015年

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

必须...击败... Perl ...

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必须击败珍珠...
Tschallacka 2015年

5

的JavaScript ES6(目前),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和之间不需要空格(
apsillers 2015年

@apsillers好点。我本来打算做第二个建议,但我根本没有时间。感谢您的高尔夫!^ _ ^
Conor O'Brien 2015年

2
我认为您只需public|private在正则表达式中就可以节省2个字节!
唐·黑斯廷斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.