Holen Sie sich die Getters


13

Die Aufgabe

Ich vermute, jeder mag die automatische Codegenerierung und das Sparen von Zeit während der Arbeit. Sie müssen tagsüber viele Klassen und Mitglieder erstellen, und Sie möchten nicht alle gettersmanuell erstellen .

Die Aufgabe besteht darin, ein Programm oder eine Funktion zu schreiben, die gettersfür alle Klassenmitglieder automatisch für Sie generiert wird .


Die Eingabe

In unserer Sprache sind Objekte sehr einfach. Namen von Klassen und Mitgliedern müssen mit einem Zeichen beginnen [a-zA-Z]und dürfen nur die Zeichen enthalten [a-zA-Z0-9]. Hier ist ein Beispiel:

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

Die Ausgabe

Dies ist eine gültige Ausgabe basierend auf dem angegebenen Beispiel:

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

Der Getter

Die Anforderungen an eine getterMethode sind:

  • Der Funktionsname muss mit beginnen, getgefolgt vom Mitgliedsnamen mit einer Initiale in Großbuchstaben.
  • Die Funktion hat keine Parameter.
  • Um eine Variable zurückzugeben, verwenden Sie return this->memberName;.
  • gettersund setters( siehe Die Boni ) müssen gruppiert werden und nach allen variablen Deklarationen stehen.

Beispiel:

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

Die Anforderungen

  • Erstellen Sie ein Programm oder eine Funktion.
  • Die Eingabe kann über STDIN, Befehlszeilenargumente, Funktionsargumente, eine Datei usw. erfolgen.
  • Jedes Ausgabeformat ist akzeptabel, von einem einfachen returnWert bis zu einer Datei oder dem Schreiben in STDOUT.
  • Ein- und Ausgang brauchen nicht mit Leerzeichen, Zeilenumbrüche formatiert werden, Registerkarten usw. Dies ist eine gültige Eingabe: class A{protected a;}.
  • Sie können davon ausgehen, dass die Eingabe gültig ist, und Ihr Programm kann auch unerwartete Eingaben verarbeiten.

Die Boni

Sie können bis zu 10% Ihrer ursprünglichen Byteanzahl reduzieren, indem Sie 30% für jede Funktion zurückziehen:

A: Ihr Programm kann neu hinzugefügte Variablen adressieren und gettersnur fehlende hinzufügen ( public function getB() { return this->b; }in diesem Fall):

class A {
    public a;
    public b;

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

B: Ihr Programm erzeugt auch setters:

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

C: Ihr Programm kann statische Member verarbeiten:

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

Das ist Codegolf - also gewinnt die kürzeste Antwort in Bytes. Standardlücken sind nicht zulässig.


3
Dies ist meine erste Frage - eine nicht allzu schwierige. Hoffe du magst es. Vielen Dank an Martin Büttner für hilfreiche Tipps in der Sandbox .
insertusernamehere

Wird es nur eine Klasse pro Eingang geben?
Conor O'Brien,

2
Wenn Sie beide Boni unterstützen, Aund Bsollten Artikel, die Getter, aber keine Setter haben, Setter in der Ausgabe haben?
FryAmTheEggman

1
@FryAmTheEggman Das ist eine sehr gute Frage. Ich würde sagen, dass Sie für Bonus B davon ausgehen können, dass die Eingabe vollständig ist. Wenn es also einen Getter gibt, gibt es auch einen Setter.
insertusernamehere

2
Auf welche Sprache dürfen Sie sich thisin einem staticAccessor beziehen ?
Neil

Antworten:


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

5
Du hast die Pyth-Antwort geschlagen.
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\}

Muss ... schlagen ... Perl ...

187-Byte / 18,7-Byte-Version

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-Byte- / 19,8-Byte-Version

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: Mehr Golfen!


3
+1 für Must Beat Pearl ...
Tschallacka

5

JavaScript ES6 (derzeit), 305 289 223 - 60% = 89,2 Byte

War 256 - 30% = 179.2 bytes

Qualifiziert für statische und Setter-Boni; jetzt mit 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``+"}")

ES5-Funktion, 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
Ich denke man o.slice(1,o.length))kann einfach auf verkürzen o.slice(1)), und ich denke man kann inline v, da man es nur einmal benutzt (also mit der Funktion anfängt return s.replace(/\}$/, s.match(...).map...). Ich glaube auch nicht, dass Sie ein Leerzeichen zwischen returnund brauchen (.
Apsillers

@apsillers Guter Punkt. Ich wollte den zweiten Vorschlag machen, aber ich hatte einfach keine Zeit. Danke fürs Golfen! ^ _ ^
Conor O'Brien

2
Ich denke, Sie können 2 Bytes sparen, wenn public|privateSie nur Regex haben!
Dom Hastings

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.