Получить добытчиков

13

Задание

Думаю, всем нравится автоматическая генерация кода и экономия времени во время работы. Вы должны создать много классов и участников в течение дня, и вы не хотите создавать все это gettersвручную.

Задача состоит в том, чтобы написать программу или функцию, которая генерирует gettersдля всех членов класса автоматически для вас.


Вход

В нашем языке объекты очень просты. Имена классов и членов должны начинаться с символа [a-zA-Z]и могут содержать только символы [a-zA-Z0-9]. Вот пример:

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

Выход

Это правильный вывод на основе данного примера:

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

Добытчик

Требования к getterметоду:

  • Имя функции должно начинаться с имени, getза которым следует имя члена с заглавной буквы.
  • Функция не имеет параметров.
  • Чтобы вернуть переменную используйте return this->memberName;.
  • gettersи setters( см . Бонусы ) должны быть сгруппированы и должны следовать после всех объявлений переменных.

Пример:

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

Требования

  • Создать программу или функцию.
  • Входные данные могут поступать из STDIN, аргументов командной строки, аргументов функции, файла и т. Д.
  • Любой выходной формат приемлем от простого return-значения до файла или записи в STDOUT.
  • Входы и выход не должны быть отформатированы пробелы, переводы строк, вкладки и т.д. Это действительный вход: class A{protected a;}.
  • Вы можете предположить, что ввод действителен, и ваша программа также может обрабатывать неожиданный ввод.

Бонусы

Вы можете получить до 10% от вашего первоначального количества байтов, сняв 30% за каждую функцию:

A: Ваша программа может адресовать только что добавленные переменные и добавляет gettersтолько отсутствующие ( public function getB() { return this->b; }в данном случае):

class A {
    public a;
    public b;

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

B: Ваша программа также генерирует setters:

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

C: Ваша программа может обрабатывать статические элементы:

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

Это код гольф - поэтому выигрывает самый короткий ответ в байтах. Стандартные лазейки запрещены.

insertusernamehere
источник
3
Это мой первый вопрос - не слишком сложный. Надеюсь, вам понравится. Спасибо Мартину Бюттнеру за полезные советы в песочнице .
имя пользователя здесь
Будет ли только один класс на вход?
Конор О'Брайен
2
При поддержке обоих бонусов Aи Bдолжны ли предметы, которые имеют геттеры, но не сеттеры, иметь сеттеры на выходе?
FryAmTheEggman
1
@FryAmTheEggman Это очень хороший вопрос. Я бы сказал, что для бонуса B вы можете предположить, что ввод завершен, поэтому, если есть геттер, есть и сеттер.
имя пользователя здесь
2
На каком языке вы можете ссылаться thisв staticаксессоре?
Нейл

Ответы:

12

Perl, 161 - 90% = 16,1 байта

$/=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
источник
5
Вы победили Pyth ответ o_o слава!
Конор О'Брайен
9

Pyth, 198 байтов - 90% = 19,8 байта 187 - 90% = 18,7 байта 183 байта - 90% = 18,3 байта

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 ... бить ... Perl ...

187-байтовая / 18,7-байтовая версия

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-байтовая / 19,8-байтовая версия

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

ТОДО: Больше игры в гольф!

kirbyfan64sos
источник
3
+1 за бить жемчужину ...
Чаллака
5

JavaScript ES6 (на данный момент), 305 289 223 - 60% = 89,2 байта

Было 256 - 30% = 179.2 bytes

Квалифицируется на статические и сеттерские бонусы; теперь с дополнительной 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, 115,6 байта

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
Я думаю, что o.slice(1,o.length))может быть просто сокращен до o.slice(1)), и я думаю, что вы можете встроить v, так как вы используете его только один раз (то есть, начать свою функцию с return s.replace(/\}$/, s.match(...).map...). Кроме того, я не верю, что вам нужно пространство между returnи (.
Апсиллеры
@apsillers Хороший вопрос. Я собирался сделать второе предложение, но у меня просто не было времени. Спасибо за ваши игры в гольф! ^ _ ^
Конор О'Брайен
2
Я думаю, что вы можете сэкономить 2 байта, просто имея public|privateв своем регулярном выражении!
Дом Гастингс