Obtenez les Getters

13

La tâche

Je suppose que tout le monde aime la génération automatique de code et gagner du temps pendant le travail. Vous devez créer beaucoup de classes et de membres pendant la journée et vous ne voulez pas créer tous ceux-ci gettersmanuellement.

La tâche consiste à écrire un programme ou une fonction, qui génère gettersautomatiquement pour tous les membres de la classe pour vous.


L'entrée

Dans notre langage, les objets sont très simples. Les noms des classes et des membres doivent commencer par un caractère de [a-zA-Z]et ne peuvent contenir que les caractères [a-zA-Z0-9]. Voici un exemple:

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

Le résultat

Il s'agit d'une sortie valide basée sur l'exemple donné:

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

Les exigences d'une getterméthode sont les suivantes:

  • Le nom de la fonction doit commencer par getsuivi du nom du membre avec une initiale en majuscule.
  • La fonction n'a pas de paramètres.
  • Pour renvoyer une variable, utilisez return this->memberName;.
  • getterset setters( voir Les bonus ) doivent être groupés et doivent venir après toutes les déclarations de variables.

Exemple:

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

Les exigences

  • Créez un programme ou une fonction.
  • L'entrée peut provenir de STDIN, d'arguments de ligne de commande, d'arguments de fonction, d'un fichier, etc.
  • Tout format de sortie est acceptable à partir d'une simple valeur returndans un fichier ou d'une écriture dans STDOUT.
  • Entrée et de sortie ne doivent pas être mis en forme avec des espaces blancs, les nouvelles lignes, onglets , etc. Ceci est une entrée valide: class A{protected a;}.
  • Vous pouvez supposer que l'entrée est valide et que votre programme peut également gérer une entrée inattendue.

Les bonus

Vous pouvez obtenir jusqu'à 10% de votre nombre d'octets d'origine en retirant 30% pour chaque fonctionnalité:

R: Votre programme peut traiter les variables nouvellement ajoutées et n'ajoute que les manquantes getters( public function getB() { return this->b; }dans ce cas):

class A {
    public a;
    public b;

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

B: Votre programme génère également setters:

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

C: Votre programme peut gérer les membres statiques:

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

C'est le golf de code - donc la réponse la plus courte en octets l'emporte. Les failles standard ne sont pas autorisées.

insertusernamehere
la source
3
Ceci est ma première question - pas trop difficile. J'espère que vous aimez. Merci à Martin Büttner pour ses conseils utiles dans le bac à sable .
insertusernamehere
Y aura-t-il une seule classe par entrée?
Conor O'Brien
2
Lors de la prise en charge des deux bonus Aet les Béléments qui ont des getters, mais pas de setters, devraient-ils avoir des setters dans la sortie?
FryAmTheEggman
1
@FryAmTheEggman C'est une très bonne question. Je dirais que pour le bonus B, vous pouvez supposer que l'entrée est terminée, donc s'il y a un getter, il y a aussi un setter.
insertusernamehere
2
Dans quelle langue êtes-vous autorisé à faire référence à thisun staticaccesseur?
Neil

Réponses:

12

Perl, 161 - 90% = 16,1 octets

$/=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
la source
5
Vous avez battu la réponse Pyth o_o bravo!
Conor O'Brien
9

Pyth, 198 octets - 90% = 19,8 octets 187 - 90% = 18,7 octets 183 octets - 90% = 18,3 octets

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

Doit ... battre ... Perl ...

Version 187 octets / 18,7 octets

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

Version 198 octets / 19,8 octets

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: Plus de golf!

kirbyfan64sos
la source
3
+1 pour Must beat pearl ...
Tschallacka
5

JavaScript ES6 (en ce moment), 305 289 223 - 60% = 89,2 octets

Était 256 - 30% = 179.2 bytes

Se qualifie pour les bonus statiques et setter; maintenant avec ES6 supplémentaire!

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

Fonction ES5, 115,6 octets

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
la source
1
Je pense que l' o.slice(1,o.length))on peut simplement le raccourcir o.slice(1)), et je pense que vous pouvez le faire en ligne v, puisque vous ne l'utilisez qu'une seule fois (c'est-à-dire, démarrez votre fonction avec return s.replace(/\}$/, s.match(...).map...). De plus, je ne pense pas que vous ayez besoin d'un espace entre returnet (.
apsillers
@apsillers Bon point. J'allais faire la deuxième suggestion, mais je n'avais tout simplement pas le temps. Merci pour vos golfs! ^ _ ^
Conor O'Brien
2
Je pense que vous pouvez économiser 2 octets public|privatedans votre regex!
Dom Hastings du
3

CJam, 71 octets

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

Essayez-le en ligne dans l' interpréteur CJam .

Dennis
la source