เปราะบาง Quine


30

เปราะบาง Quine

Quine ที่เปราะบางเป็นควินที่ตอบสนองต่อคุณสมบัติของการมีสตริงย่อยแต่ละอันโดยการลบอักขระเดียวเมื่อประเมินแล้วจะเกิดข้อผิดพลาด

ตัวอย่างเช่น. หากโปรแกรมของคุณasdfเป็นแบบ quine หากโปรแกรมนั้นมีความเปราะบางโปรแกรมต่อไปนี้จะต้องเกิดข้อผิดพลาด:

sdf
adf
asf
asd

โปรแกรมของคุณ (และสตริงย่อยทั้งหมด) จะต้องกำหนดอย่างเต็มที่และต้องเป็นภาษาเดียวกัน โปรแกรมที่เข้าสู่วงวนไม่สิ้นสุด (นั่นคือล้มเหลวในการยกเลิก) แม้ว่าจะไม่ได้ผลิตข้อผิดพลาดในที่สุดก็ถือเป็น "ผลิตข้อผิดพลาด" สำหรับวัตถุประสงค์ของการท้าทายนี้

มีช่องโหว่มาตรฐานที่ใช้รวมถึงข้อ จำกัด quine ปกติ (เช่นไม่สามารถอ่านซอร์สโค้ดของตัวเอง)

ตัวอย่างเช่นprint("foo")ไม่บอบบาง สตริงย่อยทั้งหมดเหล่านี้ต้องมีข้อผิดพลาด:

rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"

สิ่งที่ไม่ผิดพลาดคือ:

print("oo")
print("fo")
print("fo")

ดังนั้นจึงไม่บอบบาง

หมายเหตุสำคัญเกี่ยวกับการทดสอบ

ด้วยความเห็นพ้องต้องกันว่าควินินที่เป็นไปได้จะต้องตอบสนองสิ่งนี้:

จะต้องสามารถระบุส่วนของโปรแกรมที่เข้ารหัสส่วนต่าง ๆ ของโปรแกรม ("แตกต่าง" หมายถึงว่าทั้งสองส่วนปรากฏในตำแหน่งต่างกัน)

นอกจากนี้ควินินต้องไม่เข้าถึงแหล่งของตนเองไม่ว่าทางตรงหรือทางอ้อม

ตัวอย่าง

เนื่องจากฉันถือว่าฟังก์ชัน # toString ของ JavaScript เป็น "การอ่านมันเป็นซอร์สโค้ดของตัวเอง" ฉันจึงไม่อนุญาต อย่างไรก็ตามถ้าฉันไม่ได้ไปที่นี่นี่คือ quine บอบบางใน JavaScript:

f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q

Tester

นี่คือโปรแกรมที่ให้ซอร์สโค้ดของโปรแกรมของคุณสร้างโปรแกรมทั้งหมดที่ต้องมีข้อผิดพลาด

let f = (s) =>
  [...Array(s.length).keys()].map(i =>
    s.slice(0, i) + s.slice(i + 1)).join("\n");

let update = () => {
  output.innerHTML = "";
  output.appendChild(document.createTextNode(f(input.value)));
};

input.addEventListener("change", update);

update();
#output {
  white-space: pre;
}

#input, #output {
  font-family: Consolas, monospace;
}
<input id="input" value="print('foo')">
<div id="output"></div>


ฉันอนุญาต HQ9 + ได้ไหม
Oliver Ni

1
@OliverNi No
Conor O'Brien

3
สิ่งนี้ทำให้สมมติฐานเกี่ยวกับคุณสมบัติภาษา - ไม่ใช่ทุกภาษาที่มี "ข้อผิดพลาด"
Mego

2
@Mego วนซ้ำไม่สิ้นสุดได้รับอนุญาตแทนข้อผิดพลาด ภาษาทัวริงที่สมบูรณ์ทุกภาษามีลูปไม่สิ้นสุด
feersum

1
@Mego ที่ไม่เกี่ยวข้อง ทำไมถึงต้องนำกรณีทั่วไปมาใช้หากมีเซตย่อย จำกัด ต่อปัญหาเท่านั้น?
Conor O'Brien

คำตอบ:


6

Burlesque ,32 28 25 ไบต์

{3SHWD{Je!}.+{Sh}\msh}Je!

ลองที่นี่

คำแนะนำส่วนใหญ่ใน Burlesque คือ 2 ตัวอักษร และง่ายกว่ามากในการเขียนควินินใน Burlesque มากกว่า Marbelous Je!หรือ^^e!หมายถึง_~ใน CJam


1
รอสักครู่ ... ถ้านี่ไม่ใช่กอล์ฟ (และสั้นที่สุดที่นี่) จากนั้นฉันคงนึกไม่ออกว่ากอล์ฟคืออะไร! +1
Daniel

@Dopapp ปัญหาคือ Burlesque มีคำแนะนำมากเกินไปดังนั้นจึงมีโอกาสมากที่ฉันจะพลาดบางสิ่งบางอย่าง
jimmy23013

11

Python 3, 45 ไบต์

c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)

เปลี่ยนเป็น Python 3 เพื่อให้บรรทัดใหม่ต่อท้ายสามารถลบออกได้ง่าย

ฉันเริ่มด้วยโครงสร้างที่โง่ที่มี 2 ตัวแปรแทนที่จะเป็น 1 แต่การเปลี่ยนเป็น 1 ตัวแปรทำให้สั้นลง 4 ไบต์เท่านั้น

- ไบต์ (4 + 3) โดย Dennis


ไม่ทราบเกี่ยวกับการยืนยัน ทำได้ดี
เลมอนที่ทำลายได้

2
คงจะดีมากถ้าคุณเพิ่มคำอธิบาย
Sarge Borsch

เมื่อรวมexecโครงสร้างของคุณกับ%กลอุบายของฉันมันมีc='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)ขนาด 48 ไบต์
เดนนิส

1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)บันทึกอีก 3 ไบต์
Dennis

7

Python 91/92 67 ไบต์

สนุกมาก!

ตอนนี้ฉันรู้เกี่ยวกับการยืนยัน:

s='s=%r;assert len(s)==34;print(s%%s)';assert len(s)==34;print(s%s)

หากลบอักขระ char จากสตริงให้ยืนยันข้อผิดพลาด ฉันจะทำสิ่งนี้ในไม่ช้าถ้าฉันรู้คุณสมบัตินี้ยืนยัน


2
ฉันลืมเกี่ยวกับคำถามขึ้นบรรทัดใหม่ ... หากคุณนับคำถามคำตอบของเราจะไม่ถูกต้องเนื่องจากสามารถลบออกได้อย่างปลอดภัย
feersum

7

Python 2, 51 50 46 ไบต์

lambda s='lambda s=%r:s[22:]%%s%%s':s[22:]%s%s

ตรวจสอบบนIdeone


ฟังก์ชั่น quines ได้รับอนุญาตแน่นอน
Conor O'Brien

1
ฮะ? ฉันไม่เคยได้ยินเกี่ยวกับฟังก์ชั่นที่ได้รับอนุญาตเป็น quines ... มีตัวอย่างอะไรบ้างไหม?
feersum

@feersum ข้อความค้นหาจาวาสคริปต์ควินน์ให้ผลลัพธ์เล็กน้อย
เดนนิส

@feersum มาตรฐาน Mathematica ควินนอกจากนี้ยังมีฟังก์ชั่นพื้นฐาน (ใช้#0)
Martin Ender

2
ฉันเพิ่งได้รูปลักษณ์อีกครั้งและส่วนใหญ่ของ JS หรือ Mathematica ก็เรียกฟังก์ชั่นนี้เช่นกัน ดังนั้นมันจะถูกต้องมากขึ้นที่จะเรียกพวกเขาว่า REPL ดังที่กล่าวไว้ตัวอย่างที่ Conor ระบุไว้ในข้อมูลจำเพาะของความท้าทายนี้เป็นเพียงฟังก์ชั่นดังนั้นฉันเดาว่าอย่างน้อยก็ใช้ได้ที่นี่
Martin Ender

4

C #, 145 ไบต์

_=>{var@s="_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";for(;79!=s.Length;){}System.Console.Write(s,s,'"');};

ฉันไม่ได้เขียนควินินใน C # มาก่อน แต่คะแนนที่สูงกว่านั้นดีกว่าในการเล่นกอล์ฟใช่ไหม :)

วงวนไม่สิ้นสุดถ้าตัวละครถูกลบออกจากสตริงหรือตัวเลขจากเวทมนต์เลขที่ 79 การลบตัวละครอื่น ๆ ส่งผลให้เกิดข้อผิดพลาดในการคอมไพล์

Ungolfed:

/* Action<object> Quine = */ _ => // unused parameter
{
    // String of the function (well, mostly).
    // {0} placeholder for s, so the output contains the function and string.
    // {1} placeholder for " since it requires escaping.
    var@s = "_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";

    // Infinite loop if a char is removed from the above string or if the 7 or 9 is removed.
    for(;79!=s.Length;){}

    // Print the quine.
    System.Console.Write(s,s,'"');
};

3

JavaScript, 90 ไบต์

a="a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))";a[44]!=')'?x:console.log(a,uneval(''+a))

ทำงานในคอนโซลของ Firefox 48 และควรจะทำงานในสภาพแวดล้อมอื่น ๆ ด้วยและuneval console.logรายละเอียดข้อผิดพลาด:

a="                                             "; [  ]!=' '?x:           (a       (''+a))   // SyntaxError
   a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))  a 44    )                                  // ReferenceError from calling `x`
                                                               console.     ,uneval          // ReferenceError from calling `onsole.log`, `auneval`, etc.
                                                                       log                   // TypeError from calling `console.og`, etc.

ว้าวไม่รู้เรื่องไร้สาระ นอกจากนี้ยินดีที่ได้พบคุณอย่างน้อยค่อนข้างกลับมา! : D
Conor O'Brien

@ ConorO'Brien ยินดีที่ได้กลับมา (อย่างน้อยค่อนข้าง)! ผมเคยโพสต์รูปคู่ มากขึ้นควิน-Y ตอบใช้เทคนิคนี้
ETHproductions

2

Python 2, 59 ไบต์

x='x=%r;1/(len(x)==30);print x%%x';1/(len(x)==30);print x%x

สิ่งนี้จะเป็นการโยน a ZeroDivisionErrorหาก 0, 3 หรืออักขระถูกลบออกจากสตริง การลบผลการค้นหาตัวอักษรที่แตกต่างกันในหรือNameErrorSyntaxError


2

ต้นแพร์ 50 ไบต์

a="print('a='.repr(a).';eval(a)');#f+QF>";eval(a)

ลองออนไลน์!

ไม่ใช่คำตอบที่สั้นที่สุด แต่เป็นคำตอบที่ค่อนข้างครอบคลุม การลบอักขระใด ๆ จากโปรแกรมนี้ทำให้การตรวจสอบล้มเหลวดังนั้นล่าม A Pear Tree จะไม่พยายามเรียกใช้ (ตัวอย่างเช่นคุณได้รับข้อผิดพลาดหากคุณลบบรรทัดใหม่ที่ต่อท้าย) ;#f+QF>ใช้เพื่อให้แน่ใจว่าโปรแกรมโดยรวมมี CRC-32 เป็น 0 (และf+QF>เป็นหนึ่งในสามสตริง 5 ไบต์ที่เป็นไปได้ที่สามารถวางใน ความคิดเห็นเพื่อให้บรรลุในขณะที่ยังคงอยู่ใน ASCII การใช้ ASCII เป็นสิ่งสำคัญที่นี่เพราะreprจะล้มเหลวในการไปกลับอย่างถูกต้องเป็นอย่างอื่น)

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