Obtenha os Getters

13

A tarefa

Acho que todo mundo adora a geração automática de código e economiza algum tempo durante o trabalho. Você precisa criar muitas classes e membros durante o dia e não deseja criar todas gettersmanualmente.

A tarefa é escrever um programa ou função que gere getterspara todos os alunos automaticamente para você.


A entrada

Na nossa linguagem, os objetos são muito simples. Os nomes de classes e membros devem começar com um caractere de [a-zA-Z]e podem conter apenas os caracteres [a-zA-Z0-9]. Aqui está um exemplo:

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

A saída

Esta é uma saída válida com base no exemplo fornecido:

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

The Getter

Os requisitos para um gettermétodo são:

  • O nome da função deve começar com getseguido pelo nome do membro com uma inicial maiúscula.
  • A função não possui parâmetros.
  • Para retornar um uso variável return this->memberName;.
  • getterse setters( consulte Os bônus ) devem ser agrupados e devem vir após todas as declarações de variáveis.

Exemplo:

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

Os requisitos

  • Crie um programa ou uma função.
  • A entrada pode vir de STDIN, argumentos de linha de comando, argumentos de função, um arquivo etc.
  • Qualquer formato de saída é aceitável de um returnvalor simples a um arquivo ou gravando em STDOUT.
  • Entrada e de saída não precisa ser formatado com espaços em branco, novas linhas, guias etc. Esta é uma entrada válida: class A{protected a;}.
  • Você pode assumir que a entrada é válida e seu programa também pode lidar com entradas inesperadas.

Os Bônus

Você pode reduzir até 10% da sua contagem de bytes original retirando 30% para cada recurso:

R: Seu programa pode endereçar variáveis ​​recém-adicionadas e adicionar getterssomente as que estão faltando ( public function getB() { return this->b; }neste caso):

class A {
    public a;
    public b;

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

B: Seu programa também gera setters:

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

C: Seu programa pode lidar com membros estáticos:

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

Este é o código de golfe - a resposta mais curta em bytes vence. As brechas padrão não são permitidas.

insertusernamehere
fonte
3
Esta é a minha primeira pergunta - não muito difícil. Espero que você goste. Agradecemos a Martin Büttner pelas dicas úteis na Sandbox .
insertusernamehere
Haverá apenas uma classe por entrada?
Conor O'Brien
2
Ao oferecer suporte a ambos os bônus Ae os Bitens que têm getters, mas não setters, têm setter na saída?
FryAmTheEggman 12/11/2015
1
@FryAmTheEggman Essa é uma pergunta muito boa. Eu diria que, para o bônus B, você pode assumir que a entrada está completa; portanto, se houver um getter, também haverá um setter.
insertusernamehere
2
Em qual idioma você pode se referir thisem um staticacessador?
305 Neil

Respostas:

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
fonte
5
Você venceu a resposta Pyth o_o parabéns!
Conor O'Brien
9

Pitão, 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\}

Deve ... bater ... Perl ...

Versão 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

Versão 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: Mais golfe!

kirbyfan64sos
fonte
3
+1 para deve bater pérola ...
Tschallacka
5

JavaScript ES6 (no momento), 305 289 223-60% = 89,2 bytes

Foi 256 - 30% = 179.2 bytes

Qualifica-se para bônus estáticos e levantadores; agora com ES6 extra!

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``+"}")

Função 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
fonte
1
Eu acho que o.slice(1,o.length))pode ser simplesmente reduzido o.slice(1)), e eu acho que você pode incorporar v, já que você o usa apenas uma vez (ou seja, inicie sua função com return s.replace(/\}$/, s.match(...).map...). Além disso, não acredito que você precise de um espaço entre returne (.
Apsillers
@apsillers Bom ponto. Eu ia fazer a segunda sugestão, mas simplesmente não tinha tempo. Obrigado pelo seu golfe! ^ _ ^
Conor O'Brien
2
Eu acho que você pode economizar 2 bytes apenas tendo public|privateem seu regex!
Dom Hastings
3

CJam, 71 bytes

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

Experimente on-line no intérprete CJam .

Dennis
fonte