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 getters
manuellement.
La tâche consiste à écrire un programme ou une fonction, qui génère getters
automatiquement 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 getter
méthode sont les suivantes:
- Le nom de la fonction doit commencer par
get
suivi 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;
. getters
etsetters
( 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
return
dans 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.
la source
A
et lesB
éléments qui ont des getters, mais pas de setters, devraient-ils avoir des setters dans la sortie?this
unstatic
accesseur?Réponses:
Perl, 161 - 90% = 16,1 octets
la source
Pyth,
198 octets - 90% = 19,8 octets187 - 90% = 18,7 octets183 octets - 90% = 18,3 octetsDoit ... battre ... Perl ...
Version 187 octets / 18,7 octets
Version 198 octets / 19,8 octets
TODO: Plus de golf!
la source
JavaScript ES6 (en ce moment),
305289223 - 60% = 89,2 octetsÉtait
256 - 30% = 179.2 bytes
Se qualifie pour les bonus statiques et setter; maintenant avec ES6 supplémentaire!
Fonction ES5, 115,6 octets
la source
o.slice(1,o.length))
on peut simplement le raccourciro.slice(1))
, et je pense que vous pouvez le faire en lignev
, puisque vous ne l'utilisez qu'une seule fois (c'est-à-dire, démarrez votre fonction avecreturn s.replace(/\}$/, s.match(...).map...
). De plus, je ne pense pas que vous ayez besoin d'un espace entrereturn
et(
.public|private
dans votre regex!CJam, 71 octets
Essayez-le en ligne dans l' interpréteur CJam .
la source