Ein Polyquin ist sowohl quin als auch polyglot. 1 Sie müssen ein Quine schreiben, das in mindestens zwei verschiedenen Sprachen gültig ist. Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
1 Ich habe das erfunden. Oder besser gesagt, Geobits . Anscheinend war er auch nicht der erste .
Regeln für Quines
Es werden nur echte Quines akzeptiert. Das heißt, Sie müssen den gesamten Quellcode wörtlich in STDOUT ausgeben, ohne :
- Lesen Sie Ihren Quellcode direkt oder indirekt.
- Verlassen Sie sich auf eine REPL-Umgebung, die einfach jeden Ausdruck, den Sie eingeben, auswertet und druckt.
- Verlassen Sie sich auf Sprachfunktionen, die in bestimmten Fällen nur die Quelle ausdrucken.
- Verwenden von Fehlermeldungen oder STDERR, um den Quine ganz oder teilweise zu schreiben. (Sie können Dinge in STDERR schreiben oder Warnungen / nicht schwerwiegende Fehler erzeugen, solange STDOUT eine gültige Quine ist und die Fehlermeldungen nicht Teil davon sind.)
Darüber hinaus Ihr Code muss eine Stringliteral enthalten.
Regeln für Mehrsprachige
Die beiden verwendeten Sprachen müssen sich deutlich unterscheiden. Bestimmtes:
- Es dürfen keine unterschiedlichen Versionen derselben Sprache sein (z. B. Python 2 oder Python 3).
- Es dürfen keine unterschiedlichen Dialekte derselben Sprache sein (zB Pascal vs. Delphi).
- Eine Sprache darf keine Teilmenge der anderen sein (zB C vs. C ++).
Antworten:
CJam / GolfScript, 34 Bytes
Die Byteanzahl enthält einen nachfolgenden Zeilenumbruch, da das Programm ohne diesen kein Quine wäre.
Während CJam und GolfScript in einigen Aspekten sehr ähnlich sind, gibt es viele Unterschiede. Um dies zu einem "ehrlichen" Polyquin zu machen, habe ich beschlossen, mich so weit wie möglich auf die Unterschiede zu verlassen . Mit Ausnahme der Block- und Zeichenfolgensyntax (die die Sprachen mit so vielen anderen teilen) erreicht kein Teil des Codes in beiden Sprachen genau das Gleiche.
Der Online-GolfScript-Interpreter weist einen Fehler auf. Dieses Programm funktioniert nur mit dem offiziellen Dolmetscher.
Beispiellauf
Wie es funktioniert (CJam)
Wie es funktioniert (GolfScript)
CJam / GolfScript, 12 Bytes
Betrügerische Lösung, die die Sprachunterschiede so weit wie möglich vermeidet.
Probieren Sie es online aus:
Wie es funktioniert (CJam)
Wie es funktioniert (GolfScript)
quelle
C # / Java, 746 Bytes
Ich benutze die Eigenschaft, dass Zeichen in Java als identische Unicode-Sequenzen geschrieben werden können. Wenn wir eine
A
Anweisung für den C # -Compiler und eineB
Anweisung für Java haben, können wir das folgende Codefragment verwenden:Es wird auf folgende Weise mit C # "erkannt":
Und auf folgende Weise mit Java:
Wegen
\u000A
ist Zeilenumbruch,\u002F
ist/
und\u002A
ist*
in Java.Das endgültige polyglotte Quin ist also:
Die Größe ist jedoch aufgrund der Ausführlichkeit der Sprachen zu groß.
Auf ideone.com verfügbare Zusammenstellung: C # , Java .
quelle
Python 3 und JavaScript, 134 Byte
Hier ist mein (letzter?) Versuch:
Es kann wahrscheinlich ein bisschen mehr Golf gespielt werden, besonders wenn jemand eine bessere Möglichkeit kennt, einfache Anführungszeichen in JavaScript zu erhalten.
Eingekocht sieht das Programm so aus:
Die
eval()
Funktion wertet Ausdrücke in beiden Sprachen aus. So wird der lange String ausgeführt:Dadurch wird die lange Zeichenfolge durch Leerzeichen geteilt und die durch indizierte Teilzeichenfolge ausgewertet
2%-4
. JavaScript führt die dritte Teilzeichenfolge (2 % -4 == 2
) und Python die vorletzte (2 % -4 == -2
) aus, da sich ihre Modulo-Operatoren für Negative unterschiedlich verhalten.Der Rest der Zeichenfolge wird in beiden Sprachen ignoriert. JavaScript stoppt am
//
, während Python es als Ganzzahldivision ansieht und am stoppt#
.Also druckt JavaScript den Quellcode hier auf die Konsole:
Und Python hier:
Beide verwenden den letzten Teil des Strings, der eine Vorlage des Programms ist:
quelle
a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"])
. Getestet in JavaScript, aber nicht in Python ... aber es sollte funktionieren.a.split(1)
.q=unescape("%27")
Ruby / Perl / PHP, 52
Wortwörtlich kopiert aus Christopher Durrs Perl quine.
Dies ist Missbrauchsregeln. Ruby und Perl sind definitiv nicht dieselbe Sprache, und Perl ist auch keine Teilmenge von Ruby (die meisten verknüpften Perl-Quines funktionieren beispielsweise in Ruby nicht). Aber Ruby wurde so entworfen, dass es Perl sehr ähnlich sieht, wenn Sie es wollen, und dies passiert häufig beim Golfen.
quelle
-R
und benötigen die Skript-Tags nicht. php.net/manual/en/features.commandline.options.phpBash / GolfScript, 73
In den ersten drei Zeilen befindet sich jeweils ein Leerzeichen.
Bash / GolfScript, 78
quelle
PHP / Perl - 171
Laufen mit:
Der
php
Code wird tatsächlich ausgeführt (nicht nur selbst gedruckt).quelle
Bash / Ruby,
10482Ältere Version:
Bash / Ruby, 128 ohne undefiniertes Verhalten
quelle
<<a
in Ruby funktioniert genau wie Bash, gibt aber einen String zurück. Ich habe vorher noch kein Ruby-Programm geschrieben. Ich habe gerade eine zufällige Sprache mit dieser Funktion gefunden.<<word
Gibt eine Zeichenfolge zurück, die durch eine Zeile mit einer einzelnen abgeschlossen istword
.reticular / befunge-98, 28 bytes [nicht konkurrierend]
Versuchen Sie es mit einem Netz! Versuchen Sie befunge 98!
Alles, was zwischen
;
s in befunge liegt, wird ignoriert und!
springt;
für reticular in das Segment zwischen s. So sieht reticular:Befunge sieht:
quelle
Ruby / Mathematica, 225 Bytes
Hier ist mein eigenes sehr schlagbares Polyquin (das als Beispiel und Proof-of-Concept dient):
Der erste Teil basiert auf diesem Ruby Quine und ist im Grunde:
Die Stringzuordnung ist in Mathematica genau gleich. Das
puts s%s
wird als ein Produkt von 4 Symbolen interpretiert:puts
die Zeichenfolges
,%
(das letzte REPL Ergebnis oderOut[0]
wenn es der erste Ausdruck , den Sie bewerten) und anderes
. Das ist natürlich völlig bedeutungslos, aber Mathematica kümmert sich nicht darum und;
unterdrückt jede Ausgabe, so dass dies nur im Hintergrund verarbeitet wird. Dann#
wird der Rest der Zeile zu einem Kommentar für Ruby, während Mathematica fortfährt.Der größte Teil des Mathematica-Codes besteht darin, die Format-String-Verarbeitung von Ruby ohne Verwendung von String-Literalen zu simulieren.
FromCharacterCode@{37,112}
ist%p
undFromCharacterCode@{37,112}
ist%%
. Ersteres wird durch die Zeichenfolge selbst ersetzt (wobeiInputForm
die Anführungszeichen hinzugefügt werden), letzteres durch eine einzelne%
. Das Ergebnis istPrint
ed. Der letzte Haken ist, wie man#
vorne damit umgeht. Dies ist das Symbol von Mathematica für das erste Argument einer reinen (anonymen) Funktion. Also machen wir das alles zu einer reinen Funktion, indem wir sie anhängen&
und sofort mit Argumenten aufrufen1
. Das Voranstellen eines1
zu einem Funktionsaufruf "multipliziert" das Ergebnis mit1
, die Mathematica wieder schluckt, unabhängig davon, was die Funktion zurückgibt.quelle
> <> und CJam, 165 Bytes
Für CJam beginnt das Programm mit einem mehrzeiligen Zeichenfolgenliteral. Dies wird mit
`
maskiert und verwendet dann das Standard-Quine, um den Quine-Code sowie einen nachfolgenden Kommentar zu drucken.Bei> <>
"
startet der erste Befehl ein String-Literal, das die gesamte erste Zeile durchläuft und jedes Zeichen auf den Stapel schiebt. Danach werden die abschließenden Leerzeichen (die aufgrund des Auffüllens der Eingabe erstellt wurden) gelöscht, und der Stapel wird umgekehrt. Jedes Zeichen im Stapel (dh die gesamte erste Zeile) wird ausgegeben und dann in die zweite Zeile verschoben.Die zweite Zeile macht im Wesentlichen dasselbe, nur dass sie in die entgegengesetzte Richtung zeigt, sodass Sie den Stapel nicht umkehren müssen. (Mache ich trotzdem, da ich die nachgestellten Leerzeichen löschen muss.)
Schließlich geht es weiter zur dritten Zeile. Der einzige große Unterschied besteht darin, dass Sie den CJam-Block überspringen müssen. Dies geschieht mit
.
Das einfache Anführungszeichen erfasst die gesamte Zeile (wieder rückwärts) und gibt sie dann aus.quelle
C / PHP,
266304300282241203 + 10 Bytes+10 Byte, da für das Kompilieren in C das GCC-Compiler-Flag erforderlich ist
-Dfunction=
.Wie es funktioniert (in PHP):
<?php
als HTML.//
ist kein Kommentar in HTML, daher wird er einfach gedruckt.main
wird als Funktion mit einer Variablen deklarierta
.printf
druckt einen Wagenrücklauf (um den bereits gedruckten zu überschreiben//
) und dann den Quellcode unter Verwendung einer Standard-C / PHP-Quining-Methode.#if 0
wird von PHP ignoriert.main($a)
initialisiert eine leere Variablea
. (Dient frühererror_reporting(0)
zum Ignorieren von Fehlern, die durch Aufrufen verursacht wurden.main()
)#endif
wird auch von PHP ignoriert.Wie es funktioniert (in C):
//<?php
ist ein einzeiliger Kommentar, wird also ignoriert.function
Schlüsselwort wird aufgrund des Befehlszeilen-Compiler-Arguments ignoriert-Dfunction=
.$
. (Das hat den Tag gerettet.)printf
druckt einen Wagenrücklauf (in diesem Fall nutzlos) und dann den Quellcode unter Verwendung einer Standard-C / PHP-Quining-Methode.#if 0
ignoriert alles bis zumendif
, damit PHP aufrufen kannmain
.#endif
Beendet den Block "Ignoriere mich".quelle
Wumpus / > <> / Befunge-98 28 Bytes
Probieren Sie es in Wumpus! , Versuchen Sie es in> <>! , Versuchen Sie es in Befunge-98!
Wie es funktioniert:
Wumpus-Code:
> <> Code:
Befunge-98 Code:
quelle
05AB1E / 2sable, 14 Byte, nicht konkurrierend
Probieren Sie es online! (05AB1E)
Probieren Sie es online! (2sable)
2sable leitet sich von 05AB1E ab und ist ähnlich, weist jedoch große Unterschiede auf.
Hinterer Zeilenumbruch.
quelle
C / TCL, 337 Bytes
quelle
C / Vim 4.0, 1636 Bytes
Enthält Steuerzeichen.
Ihr Vim muss das folgende Set haben:
quelle
C / Lisp, 555 Bytes
Absichtlich leere erste Zeile.
quelle
Perl / Javascript (SpiderMonkey), 106 Bytes
Probieren Sie das Perl online!
Probieren Sie das JavaScript online!
Erläuterung
Die quine-Daten werden in
$_
beiden Sprachen gespeichert und danneval
bearbeitet, was in Perl so ziemlich Standard ist. Ich habe SpiderMonkey für TIO ausgewählt, da es eineprint
Funktion hat, diese kann jedoch leicht für + 20 Byte auf den Browser portiert werden (eval("print=alert");
am Anfang der$_
Definition hinzufügen ).Perl sieht die darin gespeicherten Daten
$_
undeval
s es wie gewohnt. Da+[]
in Perl wahr'
ist, wird in$q
über das String-XOR vonh
und gespeichertO
. Der letzte Trick ist der Aufruf, inprint
dem der erste Teil für JavaScript verwendet wird+
, der in Perl alle Elemente als Zahlen behandelt und sich zu summiert0
. Dann verwenden wir den||
Operator, um das zurückzugeben, was wir tatsächlich wollen,(q($_),"=$q$_$q;",q(eval($_)))
was äquivalent ist"\$_=$q$_$q;eval(\$_)"
.In JavaScript wird
+[]
zurückgegeben0
, daher rufen wirunescape("%27")
zum Speichern'
auf$q
(existiert leideratob
nicht in SpirderMonkey ...).print
Da+
es sich beim Aufruf von um den Verkettungsoperator in JavaScript handelt, erstellt der erste Block die gewünschte Ausgabe und der zweite Teil nach dem||
wird ignoriert.Vielen Dank an Patrick Roberts Kommentar für den
unescape
Trick!Perl / JavaScript (Browser), 108 Byte
Probieren Sie das Perl online!
Erläuterung
Wir speichern die quine-Daten in
$_
beiden Sprachen und danneval
, was in Perl so ziemlich Standard ist.Perl sieht die darin gespeicherten Daten
$_
undeval
s es wie gewohnt. Daseval
Innere$_
wird ausgeführt und kann nicht analysiert werden, aber da es ausgeführt wirdeval
, tritt kein Fehler auf.printf
wird dann mit einem String in Anführungszeichenq()
mit`
als Trennzeichen aufgerufen, da nur die Verwendung dazu führen`
würde, dass Befehle in der Shell ausgeführt werden, und wird dann für die erste Verwendung von$q
, da+[]
dies in Perl wahr'
ist,$q
über stringwise-XOR vonh
und gespeichertO
.In JavaScript richtet der
eval
Block innerhalb$_
eine Funktion einq
,return
deren Argument alsString
und als Aliaseconsole.log
für giltprintf
, daconsole.log
Zeichenfolgen wieprintf
in Perl formatiert werden . Wannprintf
wird+[]
return genannt0
, also rufen wiratob
zum Entschlüsseln'
und Speichern auf$q
.quelle
Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 Byte
Überprüfen Sie es online!
Aufgrund meiner Aktualisierungen dieser Antwort dachte ich, ich würde versuchen, den Code zu optimieren, der eine andere Permutation ausgibt, aber am Ende Bash hinzufügte, wodurch ohnehin mehr Bytes hinzugefügt wurden. Dies ist zwar optimierter als mein erster Versuch (über 300 Bytes gespart), aber ich bin sicher, dass es noch weiter golfen werden kann.
Alternatives Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 Byte
Überprüfen Sie es online!
Ein bisschen näher an meinem ursprünglichen Ansatz, aber die Wiederholung der Argumente für
printf
ist immer noch verrückt. Wenn Sie stattdessen Positionsargumente verwenden, funktioniert dies nur in Chrome und es ist schwierig, auch in PHP zu arbeiten, da das$s
In%1$s
interpoliert ist, aber viele Bytes einsparen könnte, wenn Sie möglicherweise eine Kombination der beiden Ansätze verwenden ...quelle
C / dc, 152 Bytes
Kommentare nutzen, ja!
quelle
Perl 5 / Ruby / PHP / JavaScript (Browser), 153 Byte
Probieren Sie das Perl online!
Probieren Sie den Ruby online aus!
Probieren Sie das PHP online!
quelle