Eine fragile Quine

30

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 asdfeine 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>

Conor O'Brien
quelle
Darf ich HQ9 +?
Oliver Ni
1
@OliverNi No
Conor O'Brien
3
Hierbei werden Annahmen über Sprachfunktionen getroffen - nicht alle Sprachen haben "Fehler".
Mego
2
Anstelle von Fehlern sind auch @Mego-Endlosschleifen zulässig. Jede Turing-complete-Sprache hat Endlosschleifen.
Feersum
1
@Mego das ist irrelevant. Warum sollte man sich überhaupt die Mühe machen, den allgemeinen Fall anzusprechen, wenn nur eine endliche Teilmenge pro Problem zutrifft?
Conor O'Brien

Antworten:

6

Burlesque ,32 28 25 Bytes

{3SHWD{Je!}.+{Sh}\msh}Je!

Probieren 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.

jimmy23013
quelle
1
Warten Sie ... wenn dies nicht Golf ist (und bei weitem das kürzeste hier ist), dann kann ich mir nicht vorstellen, was Golf ist! +1
Daniel
@Dopapp Das Problem ist, dass Burlesque zu viele Anweisungen hat, so dass ich sehr wahrscheinlich etwas verpasst habe.
Jimmy23013
11

Python 3, 45 Bytes

c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)

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.

Feersum
quelle
wusste nicht über behaupten. Gute Arbeit
Destructible Lemon
2
Wäre toll, wenn Sie eine Erklärung hinzufügen.
Sarge Borsch
Wenn Sie Ihre execStruktur mit meinem %Trick kombinieren, stehen c='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)48 Bytes zur Verfügung.
Dennis
1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)Spart 3 weitere Bytes.
Dennis
7

Python, 91/92 67 Bytes

Das hat Spaß gemacht!

Jetzt weiß ich über zu behaupten:

s='s=%r;assert len(s)==34;print(s%%s)';assert len(s)==34;print(s%s)

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.

Zerstörbare Zitrone
quelle
2
Ich habe die nachfolgende Newline-Frage vergessen ... Wenn Sie sie zählen, sind unsere Antworten ungültig, da sie sicher entfernt werden können.
Feersum
7

Python 2, 51 50 46 Bytes

lambda s='lambda s=%r:s[22:]%%s%%s':s[22:]%s%s

Überprüfen Sie es auf Ideone .

Dennis
quelle
Funktionsquines sind in der Tat erlaubt.
Conor O'Brien
1
Huh? Ich habe noch nie davon gehört, dass Funktionen als Quines erlaubt sind ... gibt es Beispiele dafür?
Feersum
@feersum Die Abfrage Javascript quine liefert ein paar Ergebnisse.
Dennis
@feersum die standard Mathematica quine ist ebenfalls funktionsbasiert (using #0).
Martin Ender
2
Ich hatte gerade einen anderen Blick und die meisten JS- oder Mathematica-Quines rufen tatsächlich auch die Funktion auf. Es wäre also richtiger, sie REPL-Quines zu nennen. Das Beispiel von Conor in der Spezifikation dieser Herausforderung ist jedoch nur eine Funktion, daher denke ich, dass es hier zumindest gültig ist.
Martin Ender
4

145 Bytes

_=>{var@s="_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";for(;79!=s.Length;){}System.Console.Write(s,s,'"');};

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:

/* Action<object> Quine = */ _ => // unused parameter
{
    // String of the function (well, mostly).
    // {0} placeholder for s, so the output contains the function and string.
    // {1} placeholder for " since it requires escaping.
    var@s = "_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";

    // Infinite loop if a char is removed from the above string or if the 7 or 9 is removed.
    for(;79!=s.Length;){}

    // Print the quine.
    System.Console.Write(s,s,'"');
};
Milch
quelle
3

JavaScript, 90 Bytes

a="a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))";a[44]!=')'?x:console.log(a,uneval(''+a))

Funktioniert in der Konsole von Firefox 48 und sollte in jeder anderen Umgebung mit unevalund funktionieren console.log. Aufschlüsselung der Fehler:

a="                                             "; [  ]!=' '?x:           (a       (''+a))   // SyntaxError
   a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))  a 44    )                                  // ReferenceError from calling `x`
                                                               console.     ,uneval          // ReferenceError from calling `onsole.log`, `auneval`, etc.
                                                                       log                   // TypeError from calling `console.og`, etc.
ETHproductions
quelle
Wow, wusste nichts über Uneval. Auch schön dich wenigstens etwas zurück zu sehen! : D
Conor O'Brien
@ ConorO'Brien Schön, (zumindest etwas) zurück zu sein! Ich habe ein gepostet paar mehr quine-y Antworten mit dieser Technik.
ETHproductions
2

Python 2, 59 Bytes

x='x=%r;1/(len(x)==30);print x%%x';1/(len(x)==30);print x%x

Dies löst ein aus, ZeroDivisionErrorwenn eine 0, eine 3 oder ein Zeichen aus der Zeichenfolge entfernt wird. Das Entfernen eines anderen Zeichens führt zu a NameErroroder a SyntaxError.

Daniel
quelle
2

Ein Birnbaum , 50 Bytes

a="print('a='.repr(a).';eval(a)');#f+QF>";eval(a)

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 (und f+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 er reprsonst nicht korrekt umlaufen würde).


quelle