Отримати Getters


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% за кожну функцію:

Відповідь: Ваша програма може адресувати нещодавно додані змінні та додавати 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; }
}

Це кодовий гольф - тому найкоротша відповідь у байтах виграє. Стандартні лазівки заборонені.


3
Це моє перше питання - не надто важке. Сподіваюся, вам сподобається. Дякуємо Мартіну Бюттнеру за корисні поради в пісочниці .
insertusernamehere

Чи буде лише один клас на вхід?
Conor O'Brien

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

5
Ви побили відповідь Pyth o_o kudos!
Conor O'Brien

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

Потрібно ... бити ... Перл ...

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

TODO: Більше гольфу!


3
+1 для Must beat pearl ...
Tschallacka

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 Добре. Я збирався зробити другу пропозицію, але просто не мав часу. Дякую за ваші гольфи! ^ _ ^
Conor O'Brien

2
Я думаю, ви можете зберегти 2 байти, просто маючи public|privateв своєму регексе!
Дом Гастінгс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.