รับ The Getters


13

งาน

ฉันเดาว่าทุกคนชอบการสร้างรหัสอัตโนมัติและประหยัดเวลาในการทำงาน คุณต้องสร้างชั้นเรียนและสมาชิกจำนวนมากในระหว่างวันและคุณไม่ต้องการสร้างสิ่งเหล่านั้นgettersด้วยตนเอง

ภารกิจคือการเขียนโปรแกรมหรือฟังก์ชั่นที่สร้างขึ้นgettersสำหรับสมาชิกทุกคนในชั้นเรียนให้คุณโดยอัตโนมัติ


การป้อนข้อมูล

ในวัตถุภาษาของเรานั้นง่ายมาก ชื่อของชั้นเรียนและสมาชิกจะต้องเริ่มต้นด้วย chararacter จากและสามารถมีตัวอักษร[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
นี่เป็นคำถามแรกของฉัน - ไม่ยากเกินไป หวังว่าคุณจะชอบมัน. ขอขอบคุณที่มาร์ตินBüttnerสำหรับเคล็ดลับที่เป็นประโยชน์ในSandbox
แทรกชื่อที่นี่

จะมีหนึ่งคลาสต่ออินพุตเท่านั้นหรือไม่
Conor O'Brien

2
เมื่อสนับสนุนทั้งโบนัสAและBรายการที่มี getters แต่ไม่มี setters มี setters ในเอาต์พุตหรือไม่
FryAmTheEggman

1
@FryAmTheEggman นั่นเป็นคำถามที่ดีมาก ฉันจะบอกว่าสำหรับโบนัสBคุณสามารถสันนิษฐานได้ว่าการป้อนข้อมูลเสร็จสมบูรณ์ดังนั้นหากมีผู้ทะเยอทะยานก็มีหมาตัวหนึ่ง
insertusernamehere

2
ซึ่งในภาษาที่คุณจะได้รับอนุญาตในการอ้างถึงthisในstaticการเข้าถึง?
Neil

คำตอบ:


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 รุ่งโรจน์!
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\}

ต้อง ... เต้น ... Perl ...

187-byte / 18.7-byte version

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

สิ่งที่ต้องทำ:เล่นกอล์ฟเพิ่มเติม!


3
+1 สำหรับ Must Beat pearl ...
Tschallacka

5

JavaScript ES6 (ในขณะนี้), 305 289 223 - 60% = 89.2 ไบต์

เป็น 256 - 30% = 179.2 bytes

มีสิทธิ์ได้รับโบนัสคงที่และ setter; ตอนนี้พร้อม 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 จุดดี ฉันกำลังจะทำข้อเสนอแนะที่สอง แต่ฉันไม่มีเวลา ขอบคุณสำหรับสนามกอล์ฟของคุณ! ^ _ ^
Conor O'Brien

2
ฉันคิดว่าคุณสามารถบันทึก 2 ไบต์เพียงแค่มีpublic|privateregex ของคุณ!
Dom Hastings

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.