Krucha Quine
Krucha quine to quine, która spełnia właściwość polegającą na tym, że każdy podciąg utworzony przez usunięcie pojedynczego znaku, gdy jest oceniany, powoduje błąd.
Na przykład. Jeśli twój program asdf
jest quine, to aby był delikatny, następujące programy muszą zawierać błąd:
sdf
adf
asf
asd
Twój program (i wszystkie jego podciągi) musi być w pełni deterministyczny i musi być w tym samym języku. Program wchodzący w nieskończoną pętlę (czyli nie kończący się), nawet jeśli ostatecznie nie spowoduje błędu, jest uważany za „powodujący błąd” do celów tego wyzwania.
Obowiązują standardowe luki, w tym zwykłe ograniczenia quine (np. Brak możliwości odczytu własnego kodu źródłowego).
Na przykład print("foo")
nie jest kruchy. Wszystkie te podciągi muszą zawierać błąd:
rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"
Te, które nie zawierają błędów, to:
print("oo")
print("fo")
print("fo")
Więc to nie jest kruche.
Ważna uwaga na temat quines
W drodze konsensusu każdy możliwy quine musi spełniać następujące warunki:
Musi istnieć możliwość zidentyfikowania części programu, która koduje inną część programu. („Różne”, co oznacza, że dwie części pojawiają się w różnych pozycjach.)
Ponadto quine nie może uzyskać dostępu do własnego źródła, bezpośrednio lub pośrednio.
Przykład
Ponieważ uważam, że funkcja JavaScript # toString oznacza „odczytywanie własnego kodu źródłowego”, nie pozwalam na to. Gdybym jednak tego nie blokował, oto delikatna cytat w JavaScript:
f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q
Próbnik
Oto program, który na podstawie kodu źródłowego twojego programu generuje wszystkie programy, które muszą zawierać błędy.
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>