Ottieni The Getters


13

L'obiettivo

Immagino che tutti adorino la generazione automatica di codice e il risparmio di tempo durante il lavoro. Devi creare molte classi e membri durante il giorno e non vuoi crearli tutti gettersmanualmente.

Il compito è scrivere un programma o una funzione, che genera automaticamente gettersper tutti i membri della classe.


L'ingresso

Nel nostro linguaggio gli oggetti sono molto semplici. I nomi delle classi e dei membri devono iniziare con un carattere [a-zA-Z]e possono contenere solo i caratteri [a-zA-Z0-9]. Ecco un esempio:

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

Il risultato

Questo è un output valido basato sull'esempio dato:

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

I requisiti per un gettermetodo sono:

  • Il nome della funzione deve iniziare con getseguito dal nome del membro con un'iniziale maiuscola.
  • La funzione non ha parametri.
  • Per restituire un uso variabile return this->memberName;.
  • getterse setters( vedi I bonus ) devono essere raggruppati e devono venire dopo tutte le dichiarazioni variabili.

Esempio:

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

I requisiti

  • Crea un programma o una funzione.
  • L'input può provenire da STDIN, argomenti della riga di comando, argomenti della funzione, un file ecc.
  • Qualsiasi formato di output è accettabile da un semplice returnvalore a un file o scrivendo su STDOUT.
  • In- e l'uscita non hanno bisogno di essere formattato con spazi bianchi, a capo, schede ecc Questo è un input valido: class A{protected a;}.
  • Puoi supporre che l'input sia valido e che il tuo programma sia in grado di gestire anche input imprevisti imprevisti.

I bonus

Puoi ottenere fino al 10% del conteggio dei byte originale ritirando il 30% per ogni funzione:

A: Il tuo programma può indirizzare le variabili appena aggiunte e aggiunge getterssolo quelle mancanti ( public function getB() { return this->b; }in questo caso):

class A {
    public a;
    public b;

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

B: Il tuo programma genera anche setters:

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

C: Il tuo programma può gestire membri statici:

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

Questo è il golf del codice - quindi vince la risposta più breve in byte. Le scappatoie standard non sono ammesse.


3
Questa è la mia prima domanda, non troppo difficile. Spero ti piaccia. Grazie a Martin Büttner per i suggerimenti utili nella Sandbox .
inserire nomeutentequi dal

Ci sarà solo una classe per input?
Conor O'Brien,

2
Quando si supportano entrambi i bonus Ae gli Boggetti che hanno getter, ma nessun setter, dovrebbero avere setter nell'output?
FryAmTheEggman,

1
@FryAmTheEggman Questa è un'ottima domanda. Direi che per il bonus B puoi supporre che l'input sia completo, quindi se c'è un getter c'è anche un setter.
inserire nomeutentequi dal

2
In quale lingua è consentito fare riferimento thisin un staticaccessorio?
Neil,

Risposte:


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
Hai battuto la risposta 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\}

Must ... battere ... Perl ...

Versione da 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

Versione 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: più golf!


3
+1 per Must beat pearl ...
Tschallacka,

5

JavaScript ES6 (al momento), 305 289 223 - 60% = 89,2 byte

Era 256 - 30% = 179.2 bytes

Si qualifica per i bonus statici e setter; ora con 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``+"}")

Funzione 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
Penso che si o.slice(1,o.length))possa semplicemente accorciare o.slice(1)), e penso che tu possa essere in linea v, dal momento che lo usi solo una volta (cioè, inizia la tua funzione con return s.replace(/\}$/, s.match(...).map...). Inoltre, non credo che tu abbia bisogno di uno spazio tra returne (.
apsillers,

@apsillers Buon punto. Stavo per dare il secondo suggerimento, ma semplicemente non avevo tempo. Grazie per il tuo golf! ^ _ ^
Conor O'Brien,

2
Penso che puoi salvare 2 byte solo con il public|privatetuo regex!
Dom Hastings,

3

CJam, 71 byte

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

Provalo online nell'interprete CJam .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.