Consigue los captadores

13

La tarea

Supongo que a todos les encanta la generación automática de código y ahorrar algo de tiempo durante el trabajo. Tienes que crear muchas clases y miembros durante el día y no quieres crear todos esosgetters manualmente.

La tarea es escribir un programa o función que genere gettersautomáticamente para todos los miembros de la clase.


La entrada

En nuestro lenguaje los objetos son muy simples. Los nombres de las clases y los miembros deben comenzar con un carácter de [a-zA-Z]y solo pueden contener los caracteres [a-zA-Z0-9]. Aquí hay un ejemplo:

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

La salida

Este es un resultado válido basado en el ejemplo dado:

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

El getter

Los requisitos para un gettermétodo son:

  • El nombre de la función debe comenzar con get seguido del nombre del miembro con una inicial en mayúscula.
  • La función no tiene parámetros.
  • Para devolver un uso variable return this->memberName;.
  • gettersy setters( ver Los bonos ) deben estar agrupados y deben aparecer después de todas las declaraciones de variables.

Ejemplo:

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

Los requisitos

  • Crea un programa o una función.
  • La entrada puede provenir de STDIN, argumentos de línea de comando, argumentos de función, un archivo, etc.
  • Cualquier formato de salida es aceptable desde un returnvalor simple a un archivo o escribiendo a STDOUT.
  • Entradas y salida no necesitan ser formateado con espacios en blanco, saltos de línea, pestañas, etc. Esta es una entrada válida: class A{protected a;}.
  • Puede suponer que la entrada es válida y su programa también puede manejar entradas inesperadas inesperadas.

Los bonos

Puede obtener hasta el 10% de su recuento de bytes original retirando el 30% de cada función:

R: Su programa puede abordar las variables recientemente agregadas y getterssolo las que faltan ( public function getB() { return this->b; }en este caso):

class A {
    public a;
    public b;

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

B: Tu programa también genera setters:

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

C: su programa puede manejar miembros estáticos:

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

Este es el código de golf, por lo que la respuesta más corta en bytes gana. Las lagunas estándar no están permitidas.

insertusernamehere
fuente
3
Esta es mi primera pregunta, una no muy difícil. Espero que te guste. Gracias a Martin Büttner por sus útiles consejos en Sandbox .
insertusernamehere
¿Habrá solo una clase por entrada?
Conor O'Brien
2
Al apoyar ambos bonos Ay Bdeberían artículos que tienen captadores, pero no fijadores, tienen setters en la salida?
FryAmTheEggman
1
@FryAmTheEggman Esa es una muy buena pregunta. Diría que para la bonificación B , puede suponer que la entrada está completa, por lo que si hay un getter también hay un setter.
insertusernamehere
2
¿En qué idioma se le permite referirse thisen un staticdescriptor de acceso?
Neil

Respuestas:

12

Perl, 161 - 90% = 16.1 bytes

$/=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
faubi
fuente
55
¡Has vencido a la respuesta de Pyth o_o felicitaciones!
Conor O'Brien
9

Pyth, 198 bytes - 90% = 19.8 bytes 187 - 90% = 18.7 bytes 183 bytes - 90% = 18.3 bytes

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

Debe ... vencer ... Perl ...

Versión de 187 bytes / 18.7 bytes

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

Versión de 198 bytes / 19.8 bytes

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: ¡ Más golf!

kirbyfan64sos
fuente
3
+1 para Must beat pearl ...
Tschallacka
5

JavaScript ES6 (por el momento), 305 289 223 a 60% = 89,2 bytes

Fue 256 - 30% = 179.2 bytes

Califica para bonos estáticos y de establecimiento; ahora con extra 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``+"}")

Función ES5, 115,6 bytes

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("")+"}")}
Conor O'Brien
fuente
1
Creo que o.slice(1,o.length))simplemente puede acortarse o.slice(1)), y creo que puede en línea v, ya que solo lo usa una vez (es decir, comienza su función con return s.replace(/\}$/, s.match(...).map...). Además, no creo que necesites un espacio entre returny (.
apsillers
@apsillers Buen punto. Iba a hacer la segunda sugerencia, pero simplemente no tenía tiempo. Gracias por tu golf! ^ _ ^
Conor O'Brien
2
¡Creo que puedes ahorrar 2 bytes solo teniendo public|privateen tu expresión regular!
Dom Hastings
3

CJam, 71 bytes

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

Pruébelo en línea en el intérprete de CJam .

Dennis
fuente