เปราะบาง 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>