A Quine Rapuh
Quine rapuh adalah quine yang memenuhi properti setiap substring yang dibuat dengan menghapus satu karakter, ketika dievaluasi, menghasilkan kesalahan.
Sebagai contoh. Jika program Anda asdf
adalah quine, maka agar rapuh, program berikut ini harus salah:
sdf
adf
asf
asd
Program Anda (dan semua substringnya) harus sepenuhnya deterministik, dan harus dalam bahasa yang sama. Suatu program yang jatuh ke dalam infinite loop (yaitu, gagal untuk mengakhiri), bahkan jika pada akhirnya tidak menghasilkan kesalahan dianggap "menghasilkan kesalahan" untuk keperluan tantangan ini.
Celah standar berlaku, termasuk pembatasan quine yang biasa (mis. Tidak bisa membaca kode sumber sendiri).
Misalnya, print("foo")
tidak rapuh. Semua substring ini harus salah:
rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"
Yang tidak salah adalah:
print("oo")
print("fo")
print("fo")
Jadi tidak rapuh.
Catatan penting tentang quines
Dengan konsensus , segala kemungkinan quine harus memuaskan ini:
Harus dimungkinkan untuk mengidentifikasi bagian dari program yang mengkodekan bagian yang berbeda dari program. ("Berbeda" artinya kedua bagian muncul di posisi yang berbeda.)
Lebih lanjut, quine tidak boleh mengakses sumbernya sendiri, secara langsung atau tidak langsung.
Contoh
Karena saya menganggap fungsi JavaScript # toString sebagai "membaca kode sumbernya sendiri", saya tidak mengizinkannya. Namun, jika saya tidak melarangnya, ini adalah quine rapuh dalam JavaScript:
f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q
Penguji
Berikut adalah program yang, mengingat kode sumber program Anda, menghasilkan semua program yang harus salah.
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>