Als Teil seiner Antwort auf Make a Error Quine! , @Falko hat folgenden Algorithmus vorgeschlagen:
Wie erstelle ich meine eigene Lösung in 2 Minuten?
- Öffnen Sie eine neue Datei in einer IDE Ihrer Wahl.
- Schlagen Sie Ihren Kopf auf die Tastatur vor Ihnen.
- Kompilieren.
- Ersetzen Sie den Code durch die Compiler-Fehlermeldung.
- Wiederholen Sie die Schritte 3 und 4, bis der Code konvergiert.
Ich wette, ein solches Verfahren wird in den meisten Fällen ziemlich schnell beendet!
Aufgabe
Deine Aufgabe ist es, ihm das Gegenteil zu beweisen.
Schreiben Sie ein vollständiges Programm, das die folgenden Anforderungen erfüllt:
Beim Kompilieren oder Interpretieren wird eine Fehlermeldung ausgegeben, die beim Kompilieren oder Interpretieren ebenfalls zu einer Fehlermeldung führt.
Wenn Sie Schritt 1 immer wieder wiederholen, wird irgendwann ein fester Punkt erreicht, dh ein Fehler quine.
Zusätzliche Regeln
Die letzte Fehlermeldung muss eine positive Länge haben. Die vorherigen Fehlermeldungen und der ursprüngliche Quellcode sind jedoch möglicherweise leer.
Die Länge des ursprünglichen Quellcodes darf 1024 Byte nicht überschreiten.
Weder der Originalcode noch der Code, der in einem der Schritte generiert wurde, dürfen fehlerfreie Ausgaben erzeugen.
Die Ausgabe muss eindeutig als Fehlermeldung erkennbar sein, die vom Compiler / Interpreter aufgrund eines Syntaxfehlers, eines Laufzeitfehlers, einer undefinierten Referenz usw. generiert werden muss.
Ihr Programm empfängt möglicherweise keine Eingaben oder erfordert keine Flags, um die Schleife zu erzeugen.
Ihr Programm ist möglicherweise auf eine bestimmte Implementierung seiner Sprache oder Version davon angewiesen.
Wertung
Ihre Punktzahl ist die endliche Anzahl von Schritten, die Ihr Quellcode benötigt, um eine Fehlerquine zu erstellen. Die Einsendung mit der höchsten Punktzahl gewinnt.
Die Länge des Original-Quellcodes wird als Verbindungsunterbrecher verwendet. Kürzer ist besser.
Beispiel
In Chicken ist das Programm
erzeugt die folgende Fehlermeldung:
TypeError: Cannot read property 'NaN' of undefined
Wenn diese Fehlermeldung wiederum interpretiert wird, wird die Fehlermeldung ausgegeben
Error on line 1: expected 'chicken'
was sich, wenn es wiederum interpretiert wird, von selbst ergibt.
Somit ist die Punktzahl des leeren Hühnerprogramms 2.
Gegenbeispiel
Der PHP-Code
ab<?=c
generiert die Fehlermeldung
PHP Parse error: syntax error, unexpected '?' in Command line code on line 1
was sich bei der Interpretation ergibt.
Der zweite Quellcode gibt die Nachricht jedoch an STDOUT aus, wodurch diese Sequenz ungültig wird.
Segmentation fault (core dumped)
.Antworten:
Bash, 9223372036854775810
Inspiriert von der Antwort von Doorknob.
Es sollte mit
bash < file.sh
demselben Dateinamen oder mit demselben Dateinamen für jedes Programm ausgeführt werden, um die verschiedenen Dateinamen in den Fehlermeldungen zu entfernen.Die ersten Fehler sind (mit
LANG=C
):Und schlussendlich:
Das ist ein Fehler quine.
quelle
bc
meinen eigenen Code zum Dekrementieren benutze oder schreibe.Pip 0.15.05.29 , über 10 100.000
Technisch nicht gültig, da das
-w
Flag für die Warnausgabe erforderlich ist . Abgesehen davon zeigt Pip by Design keine Laufzeitfehler an, es sei denn, sie stürzen das Programm tatsächlich ab (z. B. unendliche Rekursion). Die Probleme mit diesem Code sind Dinge, über die sich andere Sprachen definitiv beschweren würden.Die genaue Anzahl der Schritte hängt nur vom zugewiesenen Wert ab.
i
Sie kann also beliebig groß sein (bis der Python-Interpreter nicht mehr genügend Speicher hat). Außerdem würde es länger dauern als das Alter des Universums, um die obige Sequenz zu vervollständigen. (Die Frage ergab "langsam"!)Erläuterung:
Es dauerte ein wenig, bis ich den Interpreter durchgesehen hatte und einen Fehler fand, mit dem ich beliebigen Code in die Warnmeldung einfügen konnte. Danach modifizierte es im Wesentlichen Standard-Quine-Techniken. In diesem Beispiel wird zu Erklärungszwecken ein
i
-Wert von5
verwendet.i
Speichern Sie nach dem Festlegen eine Zeichenfolge ind
und versuchen Sie dann, dieS
WAP-Anweisung auszuführen . Swap erwartet zwei Variablen (genauer lvalues).s
ist in Ordnung, aber der zweite Ausdruck isti?dRo--iRsRPda
. Wenn diesi
wahr ist (für unsere Zwecke ungleich Null), wird das Ternär zu ausgewertetdRo--iRsRPd
, dasd
von früher verwendet wird, um ein Near-Quine zu bilden - nur miti
dekrementiertem Wert. Dieser Ausdruck ist kein Wert, also beschwert sich Pip:... was dann das Ganze von vorne anfängt. ( Ist
Attempting to swap non-lvalue
eine Gruppe von No-Ops:At
Berechnet den ASCII-Wert vont = 10
,n-l
subtrahiert den Zeilenumbruch minus jeden Wert einer leeren Liste und alle Kleinbuchstaben sind nur Variablen.)Der Prozess geht genauso weiter bis hinunter zu:
Wann dies ausgeführt wird,
i
ist jetzt falsch. Der ternäre Ausdrucka
ergibt den Zweig else, der ein l-Wert ist. Somit beschwert sich Swap nicht mehr. Stattdessen erhalten wir:Und nachdem wir dies ausgeführt haben, haben wir endlich einen tatsächlichen Syntaxfehler:
... an welchem Punkt, da das "Programm" mit beginnt
R
, wird Pip sich weiterhin beschweren, dass diesR
kein unärer Operator für immer ist.Die beste Lösung, die nicht verwendet
-w
wird, hat die Länge 3:quelle
-w
zählt als Programmiersprache gemäßJulia, 3
Ein einfacher Weg, um den Ball ins Rollen zu bringen ...
Anfangsprogramm:
Fehler 1:
Es kann nicht definiert werden, aber wenn es Spanisch ist , ist es auch unerwartet. Niemand erwartet die spanische Inquisition.
Fehler 2:
Fehler 3:
Die dritte Fehlermeldung erzeugt, wenn sie als Programm gesendet wird, denselben Fehler, daher die Bewertung 3.
In Arbeit! Sicher kann ich besser als 3.
quelle
R, 5
Anfangsprogramm:
Fehler 1:
Fehler 2:
Fehler 3:
Fehler 4:
Fehler 5 (Quine):
quelle
Bash, 3
Sehr rudimentäres Shell-Skript zum Testen:
quelle
stdout
. Wenn esstdout
undstderr
wird es nicht richtig funktionieren.Rubin, 5
Erstes Programm
1
2
3
4
5 (Quine)
quelle
Java, 5
Diese sind sehr lang ... also habe ich die Gleichheit der Zeichenfolgen mit einem Python-Skript überprüft und diesen formatierten Beitrag generiert, sodass ich keine Tabulatoren in 400 Zeilen manuell einfügen müsste.
Erstes Programm
1
2
3
4
5 (Quine) - Wegen Pfostenlänge weggelassen.
quelle
javac -version
) hinzufügen ?Javascript, 3 Fehlerstufen
Das ist nicht das "Hackbeil" oder so, aber ich fand es ziemlich seltsam ...
Fehler 0 (Original):
Fehler 1:
Fehler 2:
Fehler 3 (quine):
Dies alles wurde in Internet Explorer 11.0.9600.17416 zurückgegeben, wobei die Fehler ins Englische übersetzt wurden.
Druckbildschirm:
* Die Fehlermeldungen werden in Portugiesisch angezeigt und können leicht auf Englisch übersetzt werden
quelle
JS in Firefox 66.0; 3 Fehlerstufen
Eingang:
6?4;
Fehler # 1 = Eingabe # 2:
missing : in conditional expression
Fehler # 2 = Eingabe # 3:
expected expression, got keyword 'in'
Fehler # 3 = Eingabe # 4 = Fehler # 4:
unexpected token: identifier
Dies ist der höchste, den ich bekommen habe.
quelle