ゲッターをゲット


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;}
  • 入力が有効であり、プログラムが予期しない入力を処理できると想定できます。

ボーナス

各機能の30%を引き出すことで、元のバイトカウントの10%まで下げることができます。

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

これはコードゴルフです。バイト単位の最短回答が勝ちです。標準の抜け穴は許可されていません。


3
これは私の最初の質問です-それほど難しい質問ではありません。あなたがそれを好き願っています。Sandboxの役立つヒントを提供してくれたMartinBüttnerに感謝します。
ここにユーザー名を挿入します

入力ごとにクラスは1つだけですか?
コナーオブライエン

2
両方のボーナスAをサポートする場合B、ゲッターはあるがセッターはないアイテムには出力にセッターを含めるべきですか?
FryAmTheEggman

1
@FryAmTheEggmanそれは非常に良い質問です。ボーナスBについては、入力が完了したと想定できるため、ゲッターがある場合はセッターもあると言えます。
insertusernamehere

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を賞賛します!
コナーオブライエン

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
...- 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

@apsillers良い点。私は2番目の提案をするつもりでしたが、私には時間がありませんでした。ゴルフをありがとう!^ _ ^
コナーオブライエン

2
public|private正規表現で持っているだけで2バイト節約できると思います!
ドムヘイスティングス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.