Produzieren Sie ein Programm A so, dass das Ausführen in Sprache A Programm B und das Ausführen von Programm A in Sprache B Programm C erzeugt.
Wenn Programm B in Sprache B ausgeführt wird, wird Programm A erstellt, und wenn Programm B in Sprache A ausgeführt wird, wird Programm C erstellt.
Programm C gibt "Falsche Sprache!" Aus , wenn es in Sprache A oder Sprache B ausgeführt wird.
Program | Language | Result
--------|----------|----------
A | A | Program B
B | B | Program A
A | B | Program C
B | A | Program C
C | A | "Wrong language!"
C | B | "Wrong language!"
Ihre Antwort sollte diese Vorlage verwenden:
Sprache A / Sprache B, {a Bytes} + {b Bytes} = {Gesamtbytes} Bytes
Programm A:
a code
Programm B:
b code
Programm C:
c code
Quelle:
# Language A/Language B, <a bytes> + <b bytes> = <total bytes> bytes
Program A:
a code
Program B:
b code
Program C:
c code
- Keines dieser Programme sollte Eingaben annehmen.
- Verschiedene Versionen derselben Sprache zählen als verschiedene Sprachen. (obwohl davon abgeraten wird, weil es zu langweiligen Lösungen führt)
- Die Sprachen A und B müssen unterschiedlich sein.
- Sie dürfen keinen eigenen Quellcode aus einer Datei lesen. Programme dürfen nicht leer sein
- Es gelten Standardlücken.
Hinweise
- C ++ und [Python / Bash / andere
#
kommentierte Sprachen] sind gute Kombinationen, da Sie Makros definieren können, die eine Sprache ignorieren kann
Dies ist Codegolf , daher gewinnt die kleinste Summe der Byte-Zählungen Programm A und B.
code-golf
quine
code-generation
polyglot
noɥʇʎԀʎzɐɹƆ
quelle
quelle
Wrong language!
in jeder Form ausgegeben werden (dh alle Großbuchstaben, Kleinbuchstaben usw.)?Antworten:
Befunge-98 (PyFunge) / > <> , 123 + 123 =
Programm A:266 250246 BytesProbieren Sie es in Befunge-98! , Versuchen Sie es in> <>!
Programm B:Probieren Sie es in> <>! , Versuchen Sie es in Befunge-98!
Programm C:Probieren Sie es in Befunge-98! Probieren Sie es in> <>!
Wie es funktioniert:
Die zweite Zeile in beiden Programmen ist identisch und hat für beide Sprachen die gleiche Funktion. Bei der Eingabe von links nach
<<<<
wird die gesamte zweite Zeile gedruckt. Wenn Sie rechts von diesen eingeben, drucken Sie Programm C.Wenn die erste Zeile in der falschen Sprache ausgeführt wird, wird sie durch den Programm-C-Erzeugungsabschnitt eingegeben. Andernfalls wird die oberste Zeile mit
"
der Vorderseite nach hinten gedruckt und in den zweiten Zeilenproduktionsabschnitt eingegeben.Erste Linie
Programm A: Programm B:Zweite Reihe:
Programm C
quelle
JavaScript (ES6) / Python 3, 264 + 258 = 522 Byte
Programm A:
Programm B:
Programm C:
Wahrscheinlich golfen ...
JavaScript Erklärung
Programm A:
Programm B:
Programm C:
Python Erklärung
Programm A:
Programm B:
Programm C:
quelle
Python 3 + JavaScript (Rhino), 171 + 171 = 342 Byte
Programm A (gibt Programm B in Python 3, Programm C in JavaScript aus; beachten Sie den Zeilenumbruch):
Programm B (gibt Programm A in JavaScript aus, Programm C in Python; Zeilenumbruch beachten):
Programm C (gibt in beiden Sprachen "Falsche Sprache!" Aus; hat auch eine abschließende Zeile, die in der Partitur nicht berücksichtigt wird):
Beachten Sie, dass ich hier einen ungewöhnlichen JavaScript-Dialekt verwende. Normalerweise verwenden die Benutzer Browserimplementierungen, aber diese haben Probleme mit der Ausgabe und tun dies auf seltsame Weise (mit
alert
). Ich verwende das Ubuntu-Paketrhino
, eine "Offline" -Javascript-Implementierung mit einer anderen Gruppe von Bibliotheken, die in einem typischen Browser implementiert sind (es ist als einbettbare Skriptsprache gedacht). Dies ist insofern bemerkenswert, als es eineprint
Anweisung im gleichen Stil wie beispielsweise Python 3 bereitstellt .Dies ist ein "echter Polyglott" in dem Sinne, dass beide Sprachen die gleichen Berechnungen in der gleichen Reihenfolge ausführen und ihnen die gleiche Bedeutung geben. Sie haben beide den gleichen AST (und es ist ziemlich trivial, ein Python 3 + JavaScript-Polyglott-Quine durch Reduzieren dieses Programms zu erstellen). Es gibt keinen Code, der für eine Sprache spezifisch ist, was mir hilft, die Länge zu reduzieren. Übrigens müssen Sie Python 3 verwenden, damit Sie die Anweisungen mit Semikolons trennen können (wenn Sie Zeilenumbrüche verwenden, müssen Sie die Zeilenumbrüche umgehen).
Das Programm beginnt mit der Definition von Strings
s
, undd
die halten einen Apostroph und Anführungszeichen sind. Dies ermöglicht die Ausgabe von Anführungszeichen, ohne sie später im Quellcode erwähnen zu müssen, und vermeidet Probleme mit dem Escaping (was häufig ein Problem mit Quines zu sein scheint; der Hauptgrund, warum ich so viele Quine-Probleme in Underload beantworte, ist, dass die Strings verschachtelt sind). .Das Herzstück des Programms ist das Array,
r
das den Hauptteil der beiden von der Challenge verwendeten Programme enthält. Eines der Programme (das erste in Programm A und das zweite in Programm B) ist ein Quine-Programm, bei dem das ursprüngliche Programm einfach durch Verketten von Stücken (die größtenteils aus sichr
selbst stammen, mit einigen Zeichenfolgenliteralen) ausgegeben wird anderes Druckprogramm C. Um das Programm nicht zu einem echten Quine zu machen (was es unmöglich machen würde, zu erkennen, dass wir in der falschen Sprache liefen), werden die Elemente vonr
in umgekehrter Reihenfolge gedruckt;r[0]
in Programm A istr[1]
in Programm B und umgekehrt.Schließlich ist es nur
eval
erforderlich, das richtige Element von zu verwendenr
. Dies geschieht mit dem Ausdruck([11]+[0])[1]
, der in Python 3 und JavaScript einen anderen Wert erzeugt. Beide Sprachen analysieren es identisch, aber sie haben unterschiedliche Vorstellungen darüber, was das Hinzufügen zu Listen bewirkt:Wenn Python 3 addiert
[11]
zu[0]
, wird es[11, 0]
(die Listen Verketten) und anschließend das zweite Element der Liste nehmen ([1]
) gibt uns die ganze Zahl 0.Wenn JavaScript fügt
[11]
an[0]
, wird es"110"
(die Verkettung von Zeichenfolgendarstellungen von den Listen), und dann das zweite Zeichen des Strings nehmen ([1]
) gibt uns die Zeichenfolge"1"
, die JavaScript ganz zufrieden ist als ein Index in eine Liste zu verwenden.Aus diesem Grund führt Python 3 das erste Element
r
in beiden Programmen aus (wobei bei Ausführung von Programm A fast ein Quine erzeugt und bei Ausführung von Programm B Programm C gedruckt wird). JavaScript führt das zweite Element aus und behandelt daher Programm A und Programm B umgekehrt.Übrigens, wenn Sie Programm A in Ruby ausführen, wird Programm B gedruckt, außer ohne nachfolgende Zeilenumbrüche. Wenn Sie Programm B in Ruby ausführen, wird Programm C mit Ausnahme einer nachgestellten Zeile gedruckt. Mit anderen Worten, diese Lösung funktioniert beinahe mit einem anderen Satz von Sprachen und tauscht Python 3 gegen Ruby aus (der einzige Grund, warum ich nicht einfach die neue Zeile aus Programm B lösche, um eine Punktzahl von 341 zu erhalten, ist die Inkonsistenz der neuen Zeile in Programm C würde die Einreichung disqualifizieren).
(Ich habe aus einem anderen Grund an einem "echten Polyglot" wie diesem gearbeitet, den ich jetzt als Herausforderung gepostet habe, und erkannte, dass die Techniken auch an diesen angepasst werden können.)
quelle
<pre><code>...</code></pre>
damit sie angezeigt werden."a"[0]
,"a"["0"]
und"a"[[[[[[[["0"]]]]]]]]
alle erreichen das Gleiche.C / Python, 733 Bytes + 733 Bytes = 1466 Bytes
Programm A:
Programm B:
Programm C:
Ich habe Ihren Hinweis verwendet, C / C ++ mit Python zu verwenden. Ich nehme an, es ist nicht sehr präzise, aber es ist immer noch qualifizierend.
quelle
Python 2 / Retina, 550 + 645 =
1373125412211195 BytesIch bin nicht ganz sicher, ob die
unichr
undreplace
Teile mehr Golf gespielt werden können. Ich habe versucht, Python 3 zu verwenden, aber viel geht verloren, wenn ich Klammern hinzufügen und damit umgehen muss. Ich habe versucht, das einzustellenR=unicode.replace
und zu verwenden, aber die Ausgabe wird durcheinander gebracht.Beachten Sie, dass die Ausgabe von Retina standardmäßig eine nachgestellte Newline enthält, die in den Programmen nicht enthalten ist. Wenn jemand sagt, dass ich es entfernen muss, kann das trivial gemacht werden. Der Python-Code funktioniert auch in repl.it, kann jedoch nicht für Ideone.com garantiert werden.
Beachten Sie auch, dass führende und nachfolgende Zeilenumbrüche im folgenden Code von Bedeutung sind.
Programm A (Python 2):
638587566550 Byte (UTF-8)Python 2 , Retina
Programm B (Retina):
735667655645 Byte (ISO 8859-1)Retina , Python 2
Programm C:
Python 2 , Retina
Dies kann durch die Verwendung
#!`W.*!
der letzten beiden Zeilen kürzer gemacht werden , aber dies verlängert A und B, da`
eine Zeile, in der es keine gab, anders behandelt werden muss (weil das erste Backtick in einer Zeile in der Netzhaut) ist ein Konfigurationsbegrenzer).Erläuterung:
Programm C:
Bei meinem ersten Versuch habe ich zuerst Programm C geschrieben und es größtenteils beibehalten. In Python wird die Zeichenfolge gedruckt und der Kommentar ignoriert. In der Netzhaut ersetzt es nichts durch
print"Wrong language!"
und entfernt dann die herumliegenden TeileWrong language!
.Schauen wir uns zum besseren Verständnis der komplexen Programme die vereinfachten Versionen an:
Programm A (vereinfacht):
Als ich von vorne anfing, benutzte ich das
PYTHON
Bit als Platzhalter für den Code, der Programm A drucken sollte. Diese einfachere Version machte es einfacher zu erklären, wie sowohl Programm B als auch Programm C gedruckt werden würden.Das
print
und alles drin ist das, was Programm B druckt, aber zuerst wollen wir sehen, wie Programm C gedruckt wird, denn das ist einfach. Nach demprint"..."
ist#|
. Dieser Trick ersparte mir jede Menge Schwierigkeiten, die ich bei meinem ersten Versuch hatte. Auf diese Weise kann Retina nichts durch die zweite Zeile ersetzen, die Programm C sein wird, es sei denn, es steht eine#
voran. Die letzten 2 Zeilen entfernen diese zuerst#
. Früher habe ich#{2}
die Bühne daran gehindert, alle Vorkommen von zu entfernen#
. Ich kann nicht so verwenden,#1`#
wie ich es in Programm B verwendet habe, da es Probleme verursacht, diesen Backtick in der ersten Zeile von Programm A zu haben.Das bringt mich zu meiner nächsten Aufgabe, dem Drucken von Programm B. Möglicherweise haben Sie einen weiteren Unterschied zum tatsächlichen Code festgestellt. Der aktuelle Code enthält keine Backticks, da ich sie durch Tabulatoren ersetzt habe. Ich musste ein Zeichen ersetzen, da jeder Backtick den früheren Code zu einer Konfigurationszeichenfolge in Retina machen würde, wodurch die Syntax ungültig würde. Ich habe Registerkarten ausgewählt, weil sie sichtbar sind und der Codepunkt eine einzelne Ziffer ist (
9
). Der Code druckt Programm B wie in der vereinfachten Version unten gezeigt.Programm B:
Die ersten beiden Zeilen ersetzen nichts mit dem Python-Code, sondern mit einem
#
vorangestellten und einigen leicht abweichenden Zeichen. Dieser Teil ist aus Gründen der Übersichtlichkeit weggelassen. Die nächste Stufe entfernt das zuerst#
. Dann verwende ich eine Transliteration (T) -Stufe#T`²-¹`_o`[^¹]
, um einige derreplace
im vollständigen Programm A beschriebenen Vorgänge rückgängig zu machen . Mit dieser Stufe kann eine wörtliche Pilgerfahrt¶
auf der Netzhaut ausgegeben werden , die sonst möglicherweise nicht möglich ist. Sie ersetzt·
mit¶
und³
mit²
. Das Auftreten von¹
wird gleich bleiben, da sie mit ignoriert werden[^¹]
.Programm A:
Zeilenumbrüche und Tabulatoren wurden zur besseren Lesbarkeit hinzugefügt.
Dies folgt der allgemeinen Struktur der folgenden Python-Quine:
Wenn Sie Dinge davor oder danach hinzufügen, müssen Sie sie auch in die Zeichenfolge einfügen.
Ich wollte eine dreifach zitierte Zeichenfolge verwenden, um das Einfügen von Anführungszeichen zu vereinfachen (ohne Backslashes).
s=U(39)*3;
ist die Zeichenfolge'''
. Ich habe%s
stattdessen auch verwendet%r
, um Probleme mit Zeilenumbrüchen oder anderen Zeichen zu vermeiden, die mit Backslashes maskiert werden.Also jetzt die Ersetzungen. Die erste Ersetzung
.replace(U(9),U(96));
dient dazu, Tabulatoren durch die in Programm B angezeigten Backticks zu ersetzen. Diese Ersetzung erfolgt vor der Formatierung der Zeichenfolgen, da die Tabulatoren in Programm A Tabulatoren bleiben müssen. Die anderen Ersetzungen dienen lediglich dazu, die Verwendung bestimmter Zeichen in Programm 2 zu vermeiden Programmlinie B:Diese letzten drei Ersetzungen nehmen die Transliterationsphase in Programm B vorweg, um zu verhindern, dass diese Zeichen entfernt oder transliteriert werden, wenn dies nicht der Fall sein sollte.
Der einzige andere Teil des Codes ist der Code aus Programm B, der im Wesentlichen zeichenweise kopiert wird, mit Ausnahme der Änderungen aufgrund der Ersetzungen.
¹ Vielen Dank an Martin für seinen Tipp, wie man ein Literal
¶
in der Netzhaut ausgibt . Es hat alles so viel einfacher gemacht.quelle
Befunge / Python,
381 + 485259 + 345229 + 304 = 533 BytesProgramm A: Versuchen Sie es in Befunge | Versuchen Sie es in Python
Programm B: Versuchen Sie es in Python | Versuchen Sie es in Befunge
Programm C: Versuchen Sie es in Befunge | Versuchen Sie es in Python
Erläuterung
Programm C: Dies beruht auf der Tatsache, dass Befunge-93 nicht unterstützte Befehle ignoriert. Während also
p
harmlos eine Null bei 0; 0 geschrieben wird, wird der Rest des Befehlsprint
bis zu dem<
Befehl ignoriert, der die Richtung umkehrt . Anschließend wird von rechts nach links+5+5
eine 10 (Zeilenvorschub) gefolgt von der Nachrichtenzeichenfolge auf den Stapel geschoben, und anschließend wird eine Standardausgabesequenz ausgeführt, um die Zeichenfolge zu schreiben. In Python werden nur zwei Zeichenfolgenliterale gedruckt, die miteinander verknüpft sind. Die erste Zeichenfolge (die den Befunge-Code enthält) wird jedoch durch die Array-Referenz am Ende ([+5+5:]
) getrennt.Programm B: Die erste Zeile ist eine ziemlich einfache Befunge-Sequenz zum Ausdrucken von Programm C. Das einzig Interessante ist die Art und Weise, wie Anführungszeichen unter Verwendung von
50g
(dh Lesen der Zeichen aus dem Speicher) erzeugt werden, was effizienter ist als die Berechnung des ASCII-Codes. Das#>
(eine Brücke über den Befehl direction) ist im Wesentlichen ein NOP, der verhindert, dass der Code von Python gesehen wird, da#
es sich um das Python-Kommentarzeichen handelt. Die Python-Interpretation beginnt in Zeile zwei und gibt einfach eine mehrzeilige Zeichenfolge aus, die den Quellcode von Programm A enthält.Programm A: In Python werden die ersten drei Zeilen wieder ignoriert, da sie mit beginnen
#
, während die letzte Zeile einfach Programm C ausgibt. Der Befunge-Code wandert zwischen den ersten drei Zeilen hin und her und bildet die Quelle für Programm B auf dem Stapel in umgekehrter Reihenfolge. Es beginnt mit drei Anführungszeichen, dann einer Sequenz, die eine Kopie der Quelle von Programm A erstellt, und schließlich, was im Wesentlichen eine fest codierte Zeichenfolge mit der Öffnungprint """
und der ersten Zeile des Befunge-Codes ist. Es ist dann nur noch eine Frage des Ausschreibens mit einer Standardausgabesequenz.Einige Streitpunkte:
Mir wurde gesagt, dass eine Quine, die den
g
Befehl verwendet, für diese Community keine richtige Quine ist. Ich bin mir nicht sicher, ob diese Regel auch für diese Herausforderung gelten würde, aber in diesem Fall wird diese Antwort möglicherweise auch nicht als angemessene Lösung angesehen.Befunge-93 ignoriert zwar nicht unterstützte Anweisungen, dies ist jedoch in der Spezifikation technisch nicht definiert, und Sie müssen die
-q
(leise) Befehlszeilenoption im Referenzinterpreter verwenden, um Warnungen in Programm C zu vermeiden Es ist zwar in Ordnung, aber einige der schuppigeren könnten möglicherweise abstürzen. Beachten Sie auch, dass Befunge-98 nicht unterstützte Anweisungen berücksichtigt, sodass ein 98-Interpreter nur eine unbegrenzte Schleife ausführt.quelle
-q
Flagge tatsächlich "ruhig" oder meintest du "ruhig"? Mm-ja, diese Flagge ist sehr nützlich.r
Eflect-Anweisung und der 0 ab, diep
in der ersten Zelle vorhanden warPerl / JavaScript, 176 Bytes + 176 Bytes = 352 Bytes
Ich glaube nicht, dass ich 52 Bytes vom zugrunde liegenden Mechanismus für das Kopfgeld freigeben kann, aber es hat mir Spaß gemacht, dies zu erstellen. Ich denke, was ich produziert habe, erfüllt die Kriterien ...
Programm A:
Programm B:
Programm C:
Erläuterung
Verwendet mein Perl / JavaScript-Polyquin als Basis , legt jedoch eine zusätzliche Variable fest
$P
die steuert, welches Programm generiert werden soll. Verwendet die Prüfung, die+[]
in Perl wahr ist, in JavaScript jedoch falsch.quelle