Get The Getters

13

Zadanie

Chyba wszyscy uwielbiają automatyczne generowanie kodu i oszczędność czasu podczas pracy. Musisz stworzyć wiele klas i członków w ciągu dnia i nie chcesz ich tworzyć gettersręcznie.

Zadanie polega na napisaniu programu lub funkcji, która automatycznie generuje gettersdla wszystkich członków klasy.


Wejście

W naszym języku obiekty są bardzo proste. Nazwy klas i członków muszą zaczynać się od znaku od [a-zA-Z]i mogą zawierać tylko znaki [a-zA-Z0-9]. Oto przykład:

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

Wyjście

To jest poprawny wynik na podstawie podanego przykładu:

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

Wymagania dla gettermetody są następujące:

  • Nazwa funkcji musi zaczynać się getod nazwy elementu wielkimi literami.
  • Funkcja nie ma parametrów.
  • Aby zwrócić zmienną, użyj return this->memberName;.
  • gettersoraz setters( patrz Bonusy ) muszą być pogrupowane i muszą znajdować się po wszystkich deklaracjach zmiennych.

Przykład:

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

Wymagania

  • Utwórz program lub funkcję.
  • Dane wejściowe mogą pochodzić z STDIN, argumentów wiersza poleceń, argumentów funkcji, pliku itp.
  • Dowolny format wyjściowy jest akceptowalny, od prostej wartości returndo pliku lub zapisu do STDOUT.
  • Wejścia i wyjścia nie muszą być sformatowane z spacje, znaki nowej linii, zakładki itp Jest to ważny wkład: class A{protected a;}.
  • Możesz założyć, że dane wejściowe są prawidłowe, a Twój program może również obsługiwać nieoczekiwane dane wejściowe.

Bonusy

Możesz zmniejszyć do 10% oryginalnej liczby bajtów, wypłacając 30% dla każdej funkcji:

Odp .: Twój program może zająć się nowo dodanymi zmiennymi i dodaje getterstylko brakujące ( public function getB() { return this->b; }w tym przypadku):

class A {
    public a;
    public b;

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

B: Twój program generuje również setters:

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

C: Twój program może obsługiwać elementy statyczne:

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

To jest golf golfowy - wygrywa więc najkrótsza odpowiedź w bajtach. Standardowe luki są niedozwolone.

wstawić nazwę tutaj
źródło
3
To moje pierwsze pytanie - niezbyt trudne. Mam nadzieję że ci się spodoba. Podziękowania dla Martina Büttnera za pomocne wskazówki w piaskownicy .
inserttusernamehere
Czy będzie tylko jedna klasa na wejście?
Conor O'Brien
2
Wspierając oba bonusy Ai Bczy przedmioty, które mają gettery, ale nie mają seterów, powinny mieć setery na wyjściu?
FryAmTheEggman
1
@FryAmTheEggman To bardzo dobre pytanie. Powiedziałbym, że dla premii B można założyć, że dane wejściowe są kompletne, więc jeśli jest getter, to jest też seter.
inserttusernamehere
2
W jakim języku możesz się odwoływać thisw staticakcesorium?
Neil,

Odpowiedzi:

12

Perl, 161–90% = 16,1 bajtów

$/=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
źródło
5
Pokonałeś odpowiedź Pyth o_o kudos!
Conor O'Brien,
9

Pyth, 198 bajtów - 90% = 19,8 bajtów 187 - 90% = 18,7 bajtów 183 bajtów - 90% = 18,3 bajtów

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

Musisz ... pokonać ... Perl ...

Wersja 187-bajtowa / 18,7-bajtowa

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

Wersja 198-bajtowa / 19,8-bajtowa

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

DO ZROBIENIA: Więcej golfa!

kirbyfan64sos
źródło
3
+1 za Must beat pearl ...
Tschallacka
5

JavaScript ES6 (obecnie), 305 289 223 - 60% = 89,2 bajtów

Było 256 - 30% = 179.2 bytes

Kwalifikuje się do bonusów statycznych i premiujących; teraz z dodatkowym 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``+"}")

Funkcja ES5, 115,6 bajtów

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
źródło
1
Myślę, że o.slice(1,o.length))można to po prostu skrócić o.slice(1))i myślę, że możesz wstawić v, ponieważ używasz go tylko raz (tj. Uruchamiasz swoją funkcję return s.replace(/\}$/, s.match(...).map...). Nie uważam też, że potrzebujesz odstępu między returni (.
apsillers,
@apsillers Good point. Chciałem zrobić drugą sugestię, ale po prostu nie miałem czasu. Dzięki za twoje golfy! ^ _ ^
Conor O'Brien
2
Myślę, że możesz zaoszczędzić 2 bajty po prostu public|privatew swoim wyrażeniu regularnym!
Dom Hastings,
3

CJam, 71 bajtów

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

Wypróbuj online w interpretatorze CJam .

Dennis
źródło