In der Regel werden Polyglots so aufgebaut, dass jede Sprache Teile des Codes, die für andere Sprachen vorhanden sind, ignorieren kann, indem sie in Zeichenfolgenliterale mit Kommentarsyntax oder ähnlichen Tricks eingeschlossen werden.
Ihr Ziel ist es, einen Polyglot zu schreiben, bei dem die Ausgabe für jede Sprache der Code aus dem Polyglot ist, der diese Ausgabe erzeugt. Insbesondere muss die Ausgabe aus dem Polyglot-Code mit nur Löschungen bestehen und in der angegebenen Sprache eine Quine sein.
Regeln
- Es sind nur korrekte Quines zulässig (kein Lesen des Quellcodes, keine Eingabe, Ausgabe muss zu STDOUT oder zur nächstgelegenen Alternative erfolgen, wenn STDOUT keine Option ist, und die Programme müssen aus mehr als nur implizit gedruckten Literalen bestehen).
- Da verschiedene Sprachen unterschiedliche Kodierungen verwenden können, sind hier die Rohbytes von Bedeutung. Wenn beispielsweise die Sprache A verwendet UTF-8 und die Sprache B verwendet CP437, das (hex) Code
C3 88 46 47
wäreÈFG
für Sprache A und├êFG
für die Sprache B. - Alle Ausgaben müssen unterschiedlich sein (auch hier werden die Rohbytes verglichen). Dies vermeidet Komplikationen beim Versuch, kleinere Sprachversionen einzuschränken. Wenn zwei Sprachen denselben Teil des Codes verwenden, um dasselbe zu tun, können Sie nicht beide beanspruchen.
- Wenn Sie zwei Sprachen A und B haben,
XY
die eine gültige Ausgabe in beiden Sprachen , aberYZ
auch in B sind, können SieXY
als Ausgabe für A undYZ
als Ausgabe für B auswählen , sodass Sie beide in Ihrer Partitur beanspruchen können ( Sie können jedochXY
aufgrund der oben genannten Regel keinen Anspruch auf beide Sprachen erheben .
- Wenn Sie zwei Sprachen A und B haben,
- Alle Ausgänge müssen so kurz wie möglich sein. Wenn Ihr Code beispielsweise
print('foo')#something
für Python 3 wäre (ohne die Tatsache zu berücksichtigen, dass die Ausgabe nicht korrekt ist), wäre der Code, den Sie ausgeben müsstenprint('foo')
,print('foo')#
zulässig und nicht zulässig. Wenn es mehrere Zeichenfolgen mit gleicher (minimaler) Länge gibt, die eine korrekte Ausgabe ergeben, können Sie eine beliebige davon auswählen. - Einsendungen müssen mehrsprachig und in mindestens 2 Sprachen sein.
- Ihre Punktzahl wird von gegeben
(number of programming languages with distinct outputs)**3/(total byte size of polyglot)
. Die höchste Punktzahl gewinnt. Falls zwei Einsendungen die gleiche Punktzahl erreichen, gewinnt die Einsendung, die diese Punktzahl zuerst erreicht hat.
Antworten:
GolfScript + CJam + Fission 2 + Jelly , 4 Sprachen, 24 Bytes, Punktzahl 2.667
Beginnen wir mit dem Hex-Dump:
Für GolfScript, CJam und Fission 2 interpretieren wir dies in einer ASCII-kompatiblen Einzelbyte-Codierung wie ISO 8859-1 (die genaue Codierung spielt keine Rolle, da die Sprachen ohnehin nur Operatoren für ASCII-Zeichen definieren):
Woher
<DEL>
ist das Steuerzeichen0x7f
.In Jelly wird dies in Jellys eigener Codepage angenommen, wo es stattdessen so aussieht:
GolfScript
Die
e
letzte Zeile ist eine unbekannte Variable und#
kommentiert den Rest der Zeile aus, sodass diese ausgegeben wirdmit einem nachgestellten Zeilenvorschub. Dies ist die GolfScript / CJam Polyglot-Version des Standard-Quine:
Probieren Sie die Polyglotte. | Probieren Sie die Quine.
CJam
Hier
e#
kommentiert die letzte Zeile aus, so dass diese fast identisch gedruckt wirdohne nachgestellten Zeilenvorschub.
Versuchen Sie, die polyglotte | Probieren Sie die Quine.
Fission
Fission sieht nur die zweite Linie , die ist die Standard - Fission quine, so dass es druckt
Ich kann hier keinen Online-Link für das Polyglot bereitstellen, da TIO die Datei als UTF-8 an Fission sendet, aber Fission die Quelle byteweise liest, wodurch die letzte Zeile zu lang wird. Ich habe dies jedoch lokal mit einer ISO 8859-1-codierten Datei getestet (in der die letzte Zeile dieselbe Länge wie die zweite hat), um zu bestätigen, dass dies funktioniert.
Probieren Sie die Quine.
Gelee
Der Pilcrow ist ein Alias für Zeilenvorschub in Jelly, die Quelle entspricht also:
Alle bis auf die letzte Zeile eines Jelly-Programms sind "Hilfslinks" (dh Funktionen), die ignoriert werden können, sofern sie nicht aufgerufen werden, sofern sie syntaktisch gültig sind. Dies ist eigentlich der Grund, warum das
3
in den Programmen CJam und GolfScript an erster Stelle steht, weil sonst das"
nicht in Jelly analysiert werden kann.Andernfalls entspricht das Programm, da die Funktion nicht aufgerufen wird, nur der zweiten Zeile, der Standard-Jelly-Quine.
Probieren Sie die Polyglotte. | Probieren Sie die Quine.
quelle
> <> + Python, 2 Sprachen,
5146 Bytes, Score ~ =0,160,17Da es noch keine Antworten gibt, beginne ich mit einer einfachen
Probieren Sie es für > <> und Python
Für> <> ist die erste Zeile eine Quine (# spiegelt wider, "legt die gesamte Zeile auf den Stapel, dann drücken wir 34 (charcode for") und drucken alles), die Ausführung bewegt sich nie davon weg, so dass der Rest von ignoriert wird der Code.
Für Python ist die erste Zeile ein Kommentar, während die zweite Zeile ein Kommentar ist (Standardansatz in Python, bei dem die Zeichenfolge durch dieselbe Zeichenfolge wie beide Argumente ersetzt wird).
quelle
.
! Ich habe mein Quine mit diesem Ansatz angepasst, bevorzuge es jedoch, den String in umgekehrter Reihenfolge zu halten (da dies Bytes spart) und die Verwendung zu vermeideng
(da dies als "Lesen des Quellcodes" interpretiert werden könnte).JavaScript + Python 2 + Japt, 3 Sprachen, 132 Bytes, Score ~ = 0,205
Dies wird gedruckt
in JavaScript (nur in Firefox),
in Python 2 und
in Japt. ( Online testen! )
JavaScript
Dies ist, was JavaScript sieht:
Die erste Zeile ist ein No-Op, weil
A
sie in keiner Weise verwendet wird. Die zweite Zeile wirdS
auf die Zeichenfolge gesetztS=%s;console.log(S,uneval(S))
, und die dritte Zeile gibt sie aus, nachdem die%s
durch dieuneval
ed-Darstellung vonS
(just) ersetzt wurdeS
in Anführungszeichen eingeschlossen) . Das Ergebnis ist eine Quine in JavaScript.Python
Dies ist im Grunde, was Python sieht:
Die erste Zeile ist so ziemlich ein No-Op. der einzig wichtige teil ist der
A=1
am ende. Dies wirdA
zu einer Zahl, damit die GanzzahldivisionA//2
in der zweiten Zeile keinen Fehler auslöst.Die zweite Zeile ist meistens dieselbe, außer dass sie
S
auf die Zeichenfolge gesetzt wirdS=%r;print S%%S
. Die dritte Zeile wird gedrucktS
nach dem Ersetzen der%r
durch die Rohdarstellung vonS
(justS
in einfache Anführungszeichen eingeschlossen) . Das Ergebnis ist ein Quine in Python 2.Japt
Dies ist der JavaScript-Code, den der Japt-Interpreter sieht:
Wie Sie sehen, entspricht dies im Wesentlichen der JavaScript-Antwort, mit einer Hauptausnahme: Die letzten beiden Zeilen werden kombiniert. Infolgedessen sieht der Dolmetscher Folgendes tatsächlich:
Die erste Zeile
A
bezieht sich auf das Japt-Quine und die zweite aufS
einen Teil des JS-Quine. In Japt wird jedoch nur der letzte Ausdruck zur Ausgabe gesendet. das istA
, so ist die Ausgabe`i96d)p2`i96d)p2
.quelle
uneval
? Funktioniert nicht für michJolf +> <>, Punktzahl = 2 ** 3/15 = 0,533 ....
Arbeiten Sie daran, eine weitere Sprache hinzuzufügen.
quelle
> <>, Python 2 und 3, 3 Sprachen, 107 Bytes, Score = 27/107 ~ = 0,252
Probieren Sie es online aus: Python 2 , Python 3 , > <>
Die Python 3-Ausgabe ist genau die zweite Zeile, und die Python 2-Ausgabe ist diese Quine . Die Ausgabe> <> ist die erste Zeile.
Erläuterung
Dieses Programm basiert auf dem klassischen Python 2-Quine:
Um die Kompatibilität mit Python 2 und Python 3 zu gewährleisten, habe ich zunächst die
print
Anweisung in einen Funktionsaufruf geändert und ein zusätzliches Leerzeichen hinzugefügt, das später nützlich sein wird:Als nächstes ich brauchte eine Möglichkeit , Python zu unterscheiden 2 von Python 3. Eine der einfachsten Möglichkeiten, um sich die Tatsache zunutze zu nehmen , die
/
in Python Integer - Division 2, aber float Teilung in Python 3. Damit die folgenden Code auswertet , umTrue
in Python 2, aberFalse
in Python 3:Um die Ausgaben zwischen den beiden Sprachen zu unterscheiden, musste ich die ersten und letzten Klammern im
print
Aufruf selektiv entfernen (deshalb habe ich den Speicherplatz früher benötigt - ohne Leerzeichen wäre es keine gültigeprint
Anweisung in Python 2). . Daher musste ich das Quine-Geschirr folgendermaßen modifizieren:Dass Ausdruck
a:-a|9
auswertet , um0:9
in Python 2 und1:-1
in Python 3. Somitb
ist"(_%(_,b))"
in Python 3, aber in Python 2 die ersten und letzte Zeichen werden verworfen, verlassen_%(_,b)
. Und mit dieser Modifikation war der Polyglot für diese Herausforderung gültig.Wie von Teal Pelican vorgeschlagen, kann das> <> Quine
#o<}-1:"
relativ einfach hinzugefügt werden, da#
in Python ein einzeiliger Kommentar beginnt. Einfach voranstellen und eine neue Zeile fügt eine weitere Sprache hinzu und erhöht die Punktzahl um fast das Zehnfache.quelle
Python 2 + Retina, 2 Sprachen, 55 Bytes, Score = 2 ^ 3/55 ≈ 0,145
Ich habe
$n
stattdessen¶
beide gültigen ASCII-Werte beibehalten.Python , Netzhaut
Python:
Retina:
quelle
> <> + Pyke + Python 2, 81 Bytes, Score = 3 ** 3/81 ~ 0,333
Ich habe versucht, mit allen Sprachen etwas anderes zu machen.
> <> sieht:
Dies ist eine kleine Modifikation des Standard-Quines, um am Anfang eine dreifach zitierte Zeichenfolge zu verwenden. Dies ermöglicht, dass sich die abschließenden dreifachen Anführungszeichen für Python in einer anderen Zeile befinden.
Probieren Sie es online!
Pyke sieht:
Ich hatte in Pyke noch nie eine Quine erschaffen und musste mir deshalb eine überlegen. Ich habe traditionelle Quining-Techniken verwendet, um eine Zeichenfolge zu erstellen und sie dann als Eingabe mit sich selbst zu bewerten. Beachten Sie, dass Warnungen deaktiviert werden müssen, damit dies ohne visuelle Beeinträchtigung funktioniert. Fehler mit einer Division durch 0 Fehler im Generierungsschritt.
Probieren Sie es hier aus! Oder nur das Quine-Teil.
Python sieht:
Es alles. Python verwendet den gesamten Code, um das Quine zu erzeugen. Ich habe mich entschieden, den Quine-Teil in den Docstring einzubetten (obwohl letztendlich Bytes gespart würden, um sie zu entfernen, aber ich denke, es ist cool). Es ist eine Modifikation der Standard-Quining-Technik.
Probieren Sie es online!
quelle