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>
quelle
Antworten:
Burlesque ,
322825 BytesProbieren Sie es hier aus.
Die meisten Anweisungen in Burlesque bestehen aus 2 Zeichen. Und in Burlesque ist es viel einfacher, eine Quine zu schreiben als in Marbelous.
Je!
oder^^e!
bedeutet_~
in CJam.quelle
Python 3, 45 Bytes
Wechseln Sie zu Python 3, damit der nachgestellte Zeilenumbruch problemlos entfernt werden kann.
Ich fing mit einer dummen Struktur an, die 2 Variablen anstelle von 1 hatte, aber das Umschalten auf 1 Variable verkürzte sie nur um 4 Bytes.
- (4 + 3) Bytes von Dennis.
quelle
exec
Struktur mit meinem%
Trick kombinieren, stehenc='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)
48 Bytes zur Verfügung.c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)
Spart 3 weitere Bytes.Python,
91/9267 BytesDas hat Spaß gemacht!
Jetzt weiß ich über zu behaupten:
Wenn ein Zeichen aus der Zeichenfolge entfernt wird, wird ein Fehler gemeldet. Ich hätte das früher getan, wenn ich von dieser Funktion gewusst hätte, behaupten.
quelle
Python 2,
515046 BytesÜberprüfen Sie es auf Ideone .
quelle
#0
).145 Bytes
Ich habe noch nie ein Quine in C # geschrieben, aber höhere Punktzahlen sind im Golf besser, oder? :)
Endlosschleife, wenn ein Zeichen aus der Zeichenfolge oder eine Ziffer aus der magic const 79 entfernt wird. Das Entfernen eines anderen Zeichens führt zu einem Kompilierungsfehler.
Ungolfed:
quelle
JavaScript, 90 Bytes
Funktioniert in der Konsole von Firefox 48 und sollte in jeder anderen Umgebung mit
uneval
und funktionierenconsole.log
. Aufschlüsselung der Fehler:quelle
Python 2, 59 Bytes
Dies löst ein aus,
ZeroDivisionError
wenn eine 0, eine 3 oder ein Zeichen aus der Zeichenfolge entfernt wird. Das Entfernen eines anderen Zeichens führt zu aNameError
oder aSyntaxError
.quelle
Ein Birnbaum , 50 Bytes
Probieren Sie es online!
Nicht die kürzeste Antwort, aber eine ziemlich umfassende; Wenn Zeichen aus diesem Programm gelöscht werden, schlägt die Prüfsumme fehl, sodass der A Pear Tree-Interpreter nicht einmal versucht, sie auszuführen. (Sie erhalten beispielsweise eine Fehlermeldung, wenn Sie die abschließende Zeile löschen.) Mit dem Befehl
;#f+QF>
wird sichergestellt, dass das gesamte Programm einen CRC-32- Wert von 0 hat (undf+QF>
eine von drei möglichen 5-Byte-Zeichenfolgen ist, in die eingefügt werden könnte) Der Kommentar, um dies zu erreichen, während Sie in ASCII bleiben (die Verwendung von ASCII ist hier wichtig, da errepr
sonst nicht korrekt umlaufen würde).quelle