Mektupları Alın


13

Görev

Sanırım herkes otomatik kod oluşturmayı ve çalışma sırasında biraz zaman kazanmayı seviyor. Gün boyunca çok sayıda sınıf ve üye oluşturmanız gettersgerekir ve bunların hepsini el ile oluşturmak istemezsiniz .

Görev, getterstüm sınıf üyeleri için sizin için otomatik olarak oluşturulan bir program veya işlev yazmaktır .


Girdi

Bizim dilimizde nesneler çok basittir. Sınıfların ve üyelerin adları bir karakterle başlamalıdır [a-zA-Z]ve yalnızca karakterleri içerebilir [a-zA-Z0-9]. İşte bir örnek:

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

Çıktı

Bu, verilen örneğe dayanan geçerli bir çıktıdır:

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

Bir getteryöntemin gereksinimleri :

  • İşlev adı, başından getbüyük harfle başlayan üye adıyla başlamalıdır .
  • Fonksiyonun hiçbir parametresi yoktur.
  • Değişken kullanımı döndürmek için return this->memberName;.
  • gettersve setters( bkz . Bonuslar ) gruplandırılmalı ve tüm değişken bildirimlerin ardından gelmelidir.

Misal:

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

Gereksinimler

  • Bir program veya işlev oluşturun.
  • Giriş STDIN, komut satırı bağımsız değişkenleri, işlev bağımsız değişkenleri, bir dosya vb.
  • Herhangi bir çıktı biçimi, basit bir returndeğerden bir dosyaya veya STDOUT'a yazmadan kabul edilebilir .
  • Giriş ve çıkış boşlukların, yeni satırlar, sekmeler vb Bu, geçerli bir girdidir ile biçimlendirilmiş olması gerekmez: class A{protected a;}.
  • Girişin geçerli olduğunu ve programınızın beklenmedik girişleri de beklenmedik şekilde işleyebileceğini varsayabilirsiniz.

Bonuslar

Her özellik için% 30'u geri çekerek orijinal bayt sayınızın% 10'una kadar düşebilirsiniz:

C: Programınız yeni eklenen değişkenleri ele alabilir ve gettersyalnızca eksikleri ekler ( public function getB() { return this->b; }bu durumda):

class A {
    public a;
    public b;

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

B: Programınız ayrıca settersşunları üretir :

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

C: Programınız statik üyeleri işleyebilir:

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

Bu kod golf - bayt çok kısa cevap kazanır. Standart boşluklara izin verilmez.


3
Bu benim ilk sorum - çok zor değil. Umarım beğenirsin. Korumalı Alan'daki yararlı ipuçları için Martin Büttner'a teşekkürler .
insertusernameburada

Her girdi için sadece bir sınıf olacak mı?
Conor O'Brien

2
Her iki ikramiyeyi desteklerken Ave Balıcıları olan, ancak ayarlayıcıları olmayan öğelerin çıktısında ayarlayıcıları olmalı mı?
FryAmTheEggman

1
@FryAmTheEggman Bu çok iyi bir soru. Bonus B için girişin tamamlandığını varsayabileceğinizi söyleyebilirim , bu yüzden bir alıcı varsa, bir ayarlayıcı da vardır.
insertusernameburada

2
thisBir staticerişimcide hangi dilde başvurabilirsiniz ?
Neil

Yanıtlar:


12

Perl, 161-90% = 16.1 bayt

$/=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
Pyud cevabını yendin o_o kudos!
Conor O'Brien

9

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

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

Zorunlu ... yendi ... Perl ...

187 bayt / 18.7 bayt sürüm

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 bayt / 19.8 bayt sürüm

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

YAPILACAKLAR: Daha fazla golf!


3
Must beat pearl için +1 ...
Tschallacka

5

(Şu anda) JavaScript ES6, 305 289 223-60% = 89.2 bayt

was 256 - 30% = 179.2 bytes

Statik ve setter bonusları için hak kazanır; şimdi ekstra ES6 ile!

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 işlevi, 115,6 bayt

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
Ben o.slice(1,o.length))sadece kısaltılabilir o.slice(1))düşünüyorum, ve ben vsadece bir kez kullandığınız için satır içi yapabilirsiniz düşünüyorum (yani, fonksiyonu ile başlatmak return s.replace(/\}$/, s.match(...).map...). Ayrıca, sana arasına boşluk ihtiyacım inanmıyorum returnve (.
apsillers

@apsillers İyi bir nokta. İkinci öneriyi yapacaktım, ama zamanım yoktu. Golfleriniz için teşekkürler! ^ _ ^
Conor O'Brien

2
Ben sadece public|privateregex sahip 2 bayt kaydedebilirsiniz düşünüyorum !
Dom Hastings

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.