Polyglotte Stücke drucken

22

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 47wäre ÈFGfür Sprache A und ├êFGfü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, XYdie eine gültige Ausgabe in beiden Sprachen , aber YZauch in B sind, können Sie XYals Ausgabe für A und YZals Ausgabe für B auswählen , sodass Sie beide in Ihrer Partitur beanspruchen können ( Sie können jedoch XYaufgrund der oben genannten Regel keinen Anspruch auf beide Sprachen erheben .
  • Alle Ausgänge müssen so kurz wie möglich sein. Wenn Ihr Code beispielsweise print('foo')#somethingfü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üssten print('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.
Mego
quelle
2
Die vorletzte Regel hört sich so an, als müssten wir beweisen, dass es unmöglich ist, das resultierende Quine durch andere mögliche Deletionen weiter zu golfen. Ist das beabsichtigt?
Martin Ender
Verbunden.
Martin Ender
Wie definieren Sie "Löschungen" bei einer Sprache, deren Befehle nicht 8 Bit lang sind? Löschen Sie jeweils einen Befehl oder ein Byte aus der Quelle?
@MartinEnder Von Treu und Glauben kann ausgegangen werden. Wenn niemand eine kürzere Quine findet, die aus dem Polyglott gebildet werden kann, gilt die Antwort als gültig.
Mego
@ ais523 Alles wird auf Byte-Ebene ausgeführt.
Mego

Antworten:

11

GolfScript + CJam + Fission 2 + Jelly , 4 Sprachen, 24 Bytes, Punktzahl 2.667

Beginnen wir mit dem Hex-Dump:

00000000:  3322 3024 700a 2721 2b4f 5222 0a3c 3024 700a 6523 7fff cccc

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):

3"0$p
'!+OR"
<0$p
e#<DEL>ÿÌÌ

Woher <DEL> ist das Steuerzeichen 0x7f.

In Jelly wird dies in Jellys eigener Codepage angenommen, wo es stattdessen so aussieht:

3"0$p½'!+OR"½<0$p½e#¶”ṘṘ

GolfScript

Die eletzte Zeile ist eine unbekannte Variable und #kommentiert den Rest der Zeile aus, sodass diese ausgegeben wird

"0$p"
0$p

mit einem nachgestellten Zeilenvorschub. Dies ist die GolfScript / CJam Polyglot-Version des Standard-Quine:

".p"
.p

Probieren Sie die Polyglotte. | Probieren Sie die Quine.

CJam

Hier e#kommentiert die letzte Zeile aus, so dass diese fast identisch gedruckt wird

"0$p"
0$p

ohne 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

'!+OR"

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:

3"0$p½'!+OR"½<0$p½e#
”ṘṘ

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 3in 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.

Martin Ender
quelle
9

> <> + Python, 2 Sprachen, 51 46 Bytes, Score ~ ​​= 0,16 0,17

Da es noch keine Antworten gibt, beginne ich mit einer einfachen

#.09;!?lo}*2+2f"
_='_=%r;print _%%_';print _%_

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

Löwe
quelle
1
Eine leichte Anpassung der Antwort> <> kann einige Bytes einsparen: - # "~ r10gol?!; 60. |!
Teal
@Tealpelican Danke, dass du mich an die Verwendung von erinnert hast .! 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 vermeiden g(da dies als "Lesen des Quellcodes" interpretiert werden könnte).
Leo
Das ist ein ziemlich guter Grund, g nicht zu verwenden. Wenn Sie einen Blick darauf werfen und ein wenig darüber nachdenken, können Sie ihn noch weiter reduzieren, indem Sie das # (ASCII 35) aus dem Stapel verwenden, um Ihr "like; # .09;!? Lo} -1"
Teal pelican
7

JavaScript + Python 2 + Japt, 3 Sprachen, 132 Bytes, Score ~ ​​= 0,205

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"""
console.log(S,uneval(S))//""";print S%S

Dies wird gedruckt

S="S=%s;console.log(S,uneval(S))";console.log(S,uneval(S))

in JavaScript (nur in Firefox),

S='S=%r;print S%%S';print S%S

in Python 2 und

`i96d)p2`i96d)p2

in Japt. ( Online testen! )

JavaScript

Dies ist, was JavaScript sieht:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A
console.log(S,uneval(S))

Die erste Zeile ist ein No-Op, weil A sie in keiner Weise verwendet wird. Die zweite Zeile wird Sauf die Zeichenfolge gesetzt S=%s;console.log(S,uneval(S)), und die dritte Zeile gibt sie aus, nachdem die %sdurch die unevaled-Darstellung von S(just) ersetzt wurdeS in Anführungszeichen eingeschlossen) . Das Ergebnis ist eine Quine in JavaScript.

Python

Dies ist im Grunde, was Python sieht:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S"
print S%S

Die erste Zeile ist so ziemlich ein No-Op. der einzig wichtige teil ist derA=1 am ende. Dies wird Azu einer Zahl, damit die Ganzzahldivision A//2in der zweiten Zeile keinen Fehler auslöst.

Die zweite Zeile ist meistens dieselbe, außer dass sie Sauf die Zeichenfolge gesetzt wird S=%r;print S%%S. Die dritte Zeile wird gedrucktS nach dem Ersetzen der %rdurch die Rohdarstellung von S(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:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"","\nconsole.log(S,uneval(S))//","";.p("r".i("n".t(),S%S))

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:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A

Die erste Zeile Abezieht sich auf das Japt-Quine und die zweite auf Seinen Teil des JS-Quine. In Japt wird jedoch nur der letzte Ausdruck zur Ausgabe gesendet. das ist A, so ist die Ausgabe `i96d)p2`i96d)p2.

ETHproductions
quelle
Was ist uneval? Funktioniert nicht für mich
Cyoce
@Cyoce developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Es funktioniert jedoch nur in Firefox.
ETHproductions
3

Jolf +> <>, Punktzahl = 2 ** 3/15 = 0,533 ....

"r0:g>o<
"Q«Q«

Arbeiten Sie daran, eine weitere Sprache hinzuzufügen.

Rɪᴋᴇʀ
quelle
2

> <>, Python 2 und 3, 3 Sprachen, 107 Bytes, Score = 27/107 ~ = 0,252

#o<}-1:"
a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

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:

_='_=%r;print _%%_';print _%_

Um die Kompatibilität mit Python 2 und Python 3 zu gewährleisten, habe ich zunächst die printAnweisung in einen Funktionsaufruf geändert und ein zusätzliches Leerzeichen hinzugefügt, das später nützlich sein wird:

_='_=%r;print (_%%_)';print (_%_)

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 , um Truein Python 2, aber Falsein Python 3:

1/1is 1

Um die Ausgaben zwischen den beiden Sprachen zu unterscheiden, musste ich die ersten und letzten Klammern im printAufruf selektiv entfernen (deshalb habe ich den Speicherplatz früher benötigt - ohne Leerzeichen wäre es keine gültige printAnweisung in Python 2). . Daher musste ich das Quine-Geschirr folgendermaßen modifizieren:

a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

Dass Ausdruck a:-a|9auswertet , um 0:9in Python 2 und 1:-1in Python 3. Somit bist "(_%(_,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.

Mego
quelle
1

Python 2 + Retina, 2 Sprachen, 55 Bytes, Score = 2 ^ 3/55 ≈ 0,145

Ich habe $nstattdessen beide gültigen ASCII-Werte beibehalten.

S='S=%r;print S%%S';print S%S#|
#$n\(*S1`$n\(*S1`
#\`#

Python , Netzhaut

Python:

S='S=%r;print S%%S';print S%S

Retina:


\(*S1`
\(*S1`
mbomb007
quelle
0

> <> + Pyke + Python 2, 81 Bytes, Score = 3 ** 3/81 ~ 0,333

"""r00gol?!;60.
a=%r;print a%%a"""#);"34.Cp\D\Es"DEp00/
a=__doc__[-15:]
print a%a

Ich habe versucht, mit allen Sprachen etwas anderes zu machen.

> <> sieht:

"""r00gol?!;60.

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:

"34.Cp\D\Es"DEp00/

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!

Blau
quelle