Eine fragile Quine
Ein fragiles Quine ist ein Quine, das die Eigenschaft erfüllt, dass jede Teilzeichenfolge, die durch Entfernen eines einzelnen Zeichens erstellt wird, bei der Auswertung einen Fehler erzeugt.
Beispielsweise. Wenn Ihr Programm asdf
eine Quine ist, müssen folgende Fehler auftreten, damit es fragil ist:
sdf
adf
asf
asd
Ihr Programm (und alle seine Teilzeichenfolgen) müssen vollständig deterministisch und in derselben Sprache sein. Ein Programm, das in eine Endlosschleife gerät (d. H. Nicht beendet werden kann), wird für die Zwecke dieser Abfrage als "fehlerhaft" eingestuft, auch wenn es keinen Fehler erzeugt.
Es gelten Standardlücken, einschließlich der üblichen Einschränkungen für Quines (z. B. dass der eigene Quellcode nicht gelesen werden kann).
Zum Beispiel print("foo")
ist nicht zerbrechlich. Alle diese Teilzeichenfolgen müssen fehlerhaft sein:
rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"
Diejenigen, die keinen Fehler machen, sind:
print("oo")
print("fo")
print("fo")
Es ist also nicht zerbrechlich.
Ein wichtiger Hinweis zu Quinen
Im Konsens muss jede mögliche Quine dies erfüllen:
Es muss möglich sein, einen Programmabschnitt zu identifizieren, der einen anderen Programmteil codiert. ("Unterschiedlich" bedeutet, dass die beiden Teile an unterschiedlichen Positionen angezeigt werden.)
Außerdem darf ein Quine weder direkt noch indirekt auf seine eigene Quelle zugreifen.
Beispiel
Da ich die Funktion # toString von JavaScript als "Lesen des eigenen Quellcodes" betrachte, lehne ich sie ab. Wenn ich es jedoch nicht verbieten würde, ist hier eine fragile Quine in JavaScript:
f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q
Prüfer
Hier ist ein Programm, das unter Berücksichtigung des Quellcodes Ihres Programms alle Programme generiert, bei denen ein Fehler auftreten muss.
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>