Quine / Error Quine Polyglot


14

Ihre Aufgabe ist einfach: Schreiben Sie ein Programm, das in zwei Sprachen ausgeführt werden kann. Es sollte sich um ein normales Quine (druckt seinen eigenen Quellcode) in Sprache 1 handeln und um ein Fehlerquine (generiert eine mit seinem eigenen Quellcode identische Fehlermeldung) in Sprache 2.

Dies ist , also gewinnt die kürzeste gültige Übermittlung (in Bytes).

Regeln:

  • Die Sprachen können beliebig ähnlich sein. Supersets / ähnliche Versionen / ähnliche Dialekte sind nicht verboten.
  • Die Regeln für die Fehlerquine sind die gleichen wie in Fehlerquine erstellen! .


Sind zwei verschiedene Dialekte von BASIC erlaubt?
MD XF

@MDXF Wenn sie genau dasselbe Verhalten haben, nur dass sie stattdessen nach STDERR ausgegeben werden, dann nein. Ansonsten ja
Esolanging Fruit

Also meine Antwort gültig ist , dann.
MD XF

@MDXF Es ist gültig.
Esolanging Fruit

Antworten:


2

Befunge-93 (FBBI) / C (tcc) , 93 + 62 = 155 Bytes

^"
>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p:1: error: declaration expected

Probieren Sie es online !: Befunge-93 , C

Vielen Dank an randomdude999 für die Feststellung, dass für den Dateinamen passende Anführungszeichen erforderlich sind.

Muss unter dem Dateinamen gespeichert werden ^"\n>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p, wo \nsich ein Zeilenumbruch befindet. Aus diesem Grund läuft das TIO für C nicht genau wie vorgesehen. Getestet, um an Lubuntu zu arbeiten.

Erklärung (C):

Das Programm kann nicht kompiliert werden und tcc gibt den Namen der Datei als Teil der Fehlermeldung aus. Abhängig vom Anfang des Codes können mehrere Kompilierungsfehler auftreten. ^Am Anfang gibt uns eine declaration expected, die kurz ist und keine problematischen Zeichen wie enthält ". Andererseits sind die Entwickler von gcc und clang sehr pessimistisch und haben sich dafür entschieden, mehrere Fehler gleichzeitig auszugeben, was nicht sehr nett ist, sodass wir ihre Compiler nicht verwenden.

Erklärung (Befunge-93):

Befunge ist für Quines insofern praktisch, als sein Code dank des "Befehls, mit dem der String-Modus umgeschaltet wird, auch als Zeichendaten verwendet werden kann . Zu Beginn führen wir einige nutzlose Stapeloperationen durch und geben dann einen p(put-Befehl) aus, der ein NUL-Zeichen auf (0, 1) setzt. Dann spiegeln wir den Anweisungszeiger nach links und beginnen, alles als Zeichenfolge zu lesen. Dies muss aufgrund des LIFO-Charakters des Stacks auf der linken Seite erfolgen. Nach dem Umbrechen und erneutem Erreichen des "Zeichens endet die Zeichenfolge. Beachten Sie, dass das Zeichen NUL das Zeichen ersetzt$Zeichen, wodurch ein Trennzeichen in der Mitte der Zeichenfolge erstellt wird. Wir schieben dann 3 Zahlen auf den Stapel und springen über die NUL (da der Interpreter leider hängt, wenn er als Anweisung ausgeführt wird). Der statische Teil der Fehlermeldung muss hier ausgeführt werden. Die meisten seiner Zeichen sind No-Ops, aber der pBefehl verbraucht drei Argumente (daher haben wir 3 Zahlen gedrückt, sonst würde ein Teil der Zeichenfolge hier gefressen), und :& 1Zeichen drücken insgesamt 4 Werte auf den Stapel, denen wir entgegenwirken mit a pund a $(pop and discard) Anweisung. Dann wird eine gewisse Arithmetik ausgeführt, um die ASCII-Codes zu verschieben, ^"\n>#001p#"und schließlich druckt eine Schleife alle Werte auf dem Stapel als Zeichen aus, bis sie ein NUL-Zeichen findet und endet.


Sie müssen ein Betriebssystem finden, das einen solchen Dateinamen unterstützt, und ihn auflisten. Ich weiß, dass Windows das nicht unterstützt.
mbomb007

@ mbomb007 Angeblich akzeptiert Linux normalerweise alle druckbaren Zeichen in einem Dateinamen mit Ausnahme von /. Das kann ich selbst jetzt nicht testen.
negative sieben

1
Welche Version von tcc hast du benutzt? Ich verwende 0.9.27-3 direkt von Arch Repos, und der Fehler, den ich bekomme, ist <define>:1: error: missing terminating " character.
randomdude999

1
In Ordnung, ich habe die genaue Version von tcc gefunden, die auf TIO verwendet wird, und ich habe die gleiche Fehlermeldung erhalten, aber nur, wenn die Anführungszeichen des Dateinamens übereinstimmen. Unübertroffene Anführungszeichen zu haben, scheint ziemlich notwendig, damit diese Antwort funktioniert. Hier ist etwas, das Ihnen helfen kann: Linux erlaubt auch Zeilenumbrüche in Dateinamen. Dies ist die tcc-Ausgabe, wenn eine neue Zeile und ein Anführungszeichen am Ende des Dateinamens eingefügt werden : (langer Link) . Dies bedeutet jedoch, dass Sie einen Weg finden müssen, um die neue Zeile und das Material in der zweiten Zeile zu drucken.
randomdude999

@ randomdude999 Danke. Ich habe die Lösung aktualisiert, um dies zu berücksichtigen. Sehr interessant, dass ein unübertroffenes Zitat solch ein Problem verursacht ...
negativ sieben

0

Applesoft BASIC / Commodore LCD BASIC , 13 Byte

?SYNTAX ERROR

Drücken Sie im Apple] [Emulator die RESETTaste, um den BASIC-Modus aufzurufen.
Drücken Sie im Commodore LCD-Emulator, RightArrowEnterum zur BASIC-Anwendung zu gelangen.
Geben Sie in beiden Fällen nicht ?SYNTAX ERRORalle Großbuchstaben ein, da diese automatisch groß geschrieben werden.


2
Der Status "Nicht konkurrierend" ist für Beiträge in Sprachen reserviert, die nach der Challenge eingereicht wurden. Wenn es nach den Regeln ungültig ist, löschen Sie es. Warten Sie zunächst auf die Bestätigung von OP, da dies meiner Meinung nach gültig sein sollte (sofern es funktioniert).
HyperNeutrino

@HyperNeutrino Danke, bearbeitet.
MD XF

1
Ich werde dann auch diesen vermuten müssen. Diese Frage ist eher brutaler als es aussieht ...
Ørjan Johansen

1
@ ØrjanJohansen Na, da bin ich mir nicht so sicher. Technisch gesehen hatte das Commore-LCD keinen Standard-Fehlerbyte-Stream, ist es also wirklich ein Fehlerquine?
MD XF

1
@ ØrjanJohansen das ? Ich denke, das könnte bedeuten, dass es unmöglich ist zu sagen, ob dies gültig ist oder nicht. Wir könnten auf die Bestätigung vom OP warten?
MD XF
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.