Kırılgan bir Quine
Kırılgan bir yüzgeç, değerlendirildiğinde, tek bir karakter çıkarılarak yapılan her alt dizgiye sahip olma özelliğini sağlayan bir yüzgeç, bir hata üretmektedir.
Örneğin. Programınız asdf
bir quine ise, kırılgan olması için aşağıdaki programlar hata yapmalıdır:
sdf
adf
asf
asd
Programınız (ve alt dizgilerinin tümü) tamamen belirleyici olmalı ve aynı dilde olmalıdır. Sonunda bir hata üretmese bile, sonsuz bir döngüye düşen bir programın (sonlandırılamayan), bu zorluğun amaçları doğrultusunda "hata ürettiği" kabul edilir.
Normal boşluk kısıtlamaları dahil standart boşluklar uygulanır (örneğin, kendi kaynak kodunu okuyamaz).
Örneğin, print("foo")
kırılgan değildir. Tüm bu alt diziler hata yapmalı:
rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"
Hata yapmayanlar:
print("oo")
print("fo")
print("fo")
Yani kırılgan değil.
Kısalar hakkında önemli bir not
Mutabakata göre , olası herhangi bir quine bunu sağlamalıdır:
Programın, programın farklı bir bölümünü kodlayan bir bölümünü tanımlamak mümkün olmalıdır. ("Farklı", iki parçanın farklı konumlarda göründüğü anlamına gelir.)
Ayrıca, bir yüzgeç doğrudan veya dolaylı olarak kendi kaynağına erişmemelidir.
Örnek
JavaScript'in # toString işlevinin "kendi kaynak kodunu okuduğunu" düşündüğüm için, buna izin vermiyorum. Ancak, eğer engellememem gerekiyorsa, işte JavaScript'te kırılgan bir kıskaç:
f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q
test cihazı
İşte, programınızın kaynak kodu verildiğinde, hata yapması gereken tüm programları üreten bir program.
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>