Dapatkan The Getters

13

Tugas

Saya kira semua orang menyukai pembuatan kode otomatis dan menghemat waktu selama bekerja. Anda harus membuat banyak kelas dan anggota di siang hari dan Anda tidak ingin membuat semua itu getterssecara manual.

Tugasnya adalah menulis program atau fungsi, yang menghasilkan gettersuntuk semua anggota kelas secara otomatis untuk Anda.


Input

Dalam bahasa kita objek sangat sederhana. Nama kelas dan anggota harus dimulai dengan karakter dari [a-zA-Z]dan hanya dapat berisi karakter [a-zA-Z0-9]. Ini sebuah contoh:

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

Hasil

Ini adalah output yang valid berdasarkan contoh yang diberikan:

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

Persyaratan untuk suatu gettermetode adalah:

  • Nama fungsi harus dimulai dengan get diikuti oleh nama anggota dengan inisial huruf besar.
  • Fungsi tidak memiliki parameter.
  • Untuk mengembalikan penggunaan variabel return this->memberName;.
  • gettersdan setters( lihat Bonus ) harus dikelompokkan dan harus datang setelah semua deklarasi variabel.

Contoh:

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

Persyaratan

  • Buat program atau fungsi.
  • Input dapat berasal dari STDIN, argumen baris perintah, argumen fungsi, file dll.
  • Setiap format output dapat diterima dari nilai sederhana returnke file atau menulis ke STDOUT.
  • In- dan output tidak perlu diformat dengan spasi putih, baris baru, tab dll. Ini adalah input yang valid: class A{protected a;} .
  • Anda dapat mengasumsikan bahwa input tersebut valid dan program Anda juga dapat menangani input yang tidak terduga.

Bonusnya

Anda bisa mendapatkan hingga 10% dari jumlah byte asli Anda dengan menarik 30% untuk setiap fitur:

A: Program Anda dapat mengatasi variabel yang baru ditambahkan dan gettershanya menambahkan yang hilang ( public function getB() { return this->b; }dalam hal ini):

class A {
    public a;
    public b;

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

B: Program Anda juga menghasilkan setters:

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

C: Program Anda dapat menangani anggota statis:

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

Ini kode golf - jadi jawaban tersingkat dalam byte menang. Celah standar tidak diijinkan.

masukkan nama pengguna di sini
sumber
3
Ini adalah pertanyaan pertama saya - yang tidak terlalu sulit. Harap Anda menyukainya. Terima kasih kepada Martin Büttner untuk tips bermanfaat di Sandbox .
masukkan nama pengguna di sini
Apakah hanya akan ada satu kelas per input?
Conor O'Brien
2
Ketika mendukung bonus Adan Bharuskah item yang memiliki getter, tetapi tidak ada setter, apakah seter dalam output?
FryAmTheEggman
1
@FryAmTheEggman Itu pertanyaan yang sangat bagus. Saya akan mengatakan bahwa untuk bonus B Anda dapat mengasumsikan bahwa input sudah selesai, jadi jika ada pengambil ada juga yang setter.
masukkan nama pengguna di sini
2
Dalam bahasa apa Anda diizinkan merujuk thispada staticpengakses?
Neil

Jawaban:

12

Perl, 161 - 90% = 16,1 byte

$/=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
sumber
5
Anda mengalahkan jawaban Pyth o_o pujian!
Conor O'Brien
9

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

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

Harus ... kalahkan ... Perl ...

Versi 187-byte / 18,7-byte

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

Versi 198-byte / 19,8-byte

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: Lebih banyak bermain golf!

kirbyfan64sos
sumber
3
+1 untuk Must beat pearl ...
Tschallacka
5

JavaScript ES6 (saat ini), 305 289 223 - 60% = 89,2 byte

Dulu 256 - 30% = 179.2 bytes

Memenuhi syarat untuk bonus statis dan setter; sekarang dengan ES6 ekstra!

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

Fungsi ES5, 115,6 byte

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
sumber
1
Saya pikir o.slice(1,o.length))bisa disingkat menjadi o.slice(1)), dan saya pikir Anda bisa sebaris v, karena Anda hanya menggunakannya sekali (yaitu, mulai fungsi Anda dengan return s.replace(/\}$/, s.match(...).map...). Juga, saya tidak percaya Anda membutuhkan ruang antara returndan (.
apsillers
@apsillers Poin yang bagus. Saya akan melakukan saran kedua, tetapi saya tidak punya waktu. Terima kasih untuk golf kamu! ^ _ ^
Conor O'Brien
2
Saya pikir Anda dapat menyimpan 2 byte hanya public|privatedi regex Anda!
Dom Hastings
3

CJam, 71 byte

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

Cobalah online di penerjemah CJam .

Dennis
sumber