Polyglots sind Programme, die in mehreren Programmiersprachen gleichzeitig gültig sind. Die meisten dieser Polyglots sind so geschrieben, dass bestimmte Konstrukte einer Sprache als Kommentare einer anderen Sprache interpretiert werden (z. B. wird #define
C als Kommentar in mehreren Skriptsprachen interpretiert).
Ich bin gespannt, ob es möglich ist, einen nicht trivialen Polyglot zu erstellen, der keine Kommentare enthält, der sich aber auch sofort ändert, wenn Sie Nicht-Leerzeichen entfernen. Ich fordere Sie daher auf, ein solches Programm zu entwickeln.
Die konkreten Regeln lauten wie folgt:
- (Ausgabe). Ihr Programm muss in jeder Ihrer Sprachen eine Ausgabe auf der Konsole erzeugen. Das heißt, Ihr Programm darf nicht einfach beendet werden, ohne etwas zu drucken.
- (Varianz). Als eine Lockerung der Standard-Polyglot-Definition kann die Ausgabe des Programms zwischen den Sprachen variieren.
- (Fehler). Ihr Programm darf in keiner Ihrer Sprachen Fehler (allgemein definiert) erzeugen. Für die meisten Sprachen ist dies so definiert, dass ein Exit-Code ungleich Null vom Compiler und / oder Interpreter zurückgegeben wird.
- (Beschränkung). Das Entfernen eines einzelnen Nicht-Leerzeichens aus Ihrem Code sollte dazu führen, dass Ihr Programm sein Verhalten in jeder Ihrer Sprachen ändert . Das Programm kann sich "ändern", indem es für diese Sprache ungültig wird oder indem die erzeugte Ausgabe geändert wird.
- Dies ist eine Code-Herausforderung . Gewinner ist das Programm, das in den meisten Programmiersprachen gültig ist. Die Krawatten werden zugunsten einer kürzeren Programmlänge abgebrochen.
Die Einschränkungsregel gilt nicht für das Entfernen mehrerer Zeichen. Das heißt, es ist in Ordnung, wenn das Entfernen mehrerer Zeichen gleichzeitig keine Änderung für eine Ihrer Sprachen zur Folge hat.
Beachten Sie, dass die Einschränkungsregel impliziert, dass Sie Whitespace nicht als eine Ihrer Sprachen verwenden können, da das Entfernen von Nicht-Whitespace-Zeichen das Verhalten des Whitespace-Programms nicht ändert.
Hier ist ein einfaches Beispiel für ein Programm, das alle oben genannten Einschränkungen für die Sprachen Python 2 und Python 3 erfüllt:
print("Hello World!")
Das Entfernen eines Zeichens in print
bewirkt, dass beide Sprachen ein NameError
; Wenn Sie eine eckige Klammer oder ein Anführungszeichen entfernen, wird ein ausgelöst SyntaxError
, und wenn Sie Zeichen aus der Zeichenfolge entfernen, wird die Ausgabe in beiden Sprachen geändert. (Beachten Sie, dassprint("hello", "world")
es sich um ein subtileres, aber immer noch gültiges Programm handelt, das den obigen Regeln entspricht).
Dieses Beispiel ist ein bisschen lahm, da Python 2 und Python 3 sehr ähnlich sind. Daher akzeptiere ich keine anderen Lösungen, die nur unterschiedliche Versionen derselben Sprache verwenden (insbesondere Python 2 und Python 3).
quelle
print("Hello World!")
ist auch gültiger Ruby-CodeAntworten:
Bash + GolfScript + CJam
Ausgabe
Bash:
GolfScript:
CJam:
Da ist ein
\x7f
Ende der Ausgabe von CJam.quelle
Bash + Befunge
druckt "Hallo" in befunge.
quelle
bc, GolfScript, Homespring, huh, Octave, Scilab (0 Bytes)
Garantiert, um Regel 4 einzuhalten. Nicht ein Sieger, aber würde gut im Gleichstand brechen.
Ausgabe
bc
GolfScript
Homespring
huh
Oktave
Scilab
quelle
What?\n?
wird übrigens gedruckt .make: *** No targets. Stop.
GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Oktave + Matlab + Scilab + Numerische Topline +? Fueue + huh?
In Golscript, PHP, CJam, Mathematica, BC, Pyth, /// und TI-Basic wird ausgegeben
10
.In R wird ausgegeben
[1] 10
In Octave wird ausgegeben
ans = 10
In Matlab und Scilab wird ausgegeben
ans = 10
.In der numerischen Topline wird ausgegeben
0
.Wenn ich Fueue richtig verstehe, gibt es einen Zeilenumbruch aus und fungiert dann als Katzenprogramm.
In huh ?, gibt es aus
quelle
72
zu10
, sollte es gedruckt0
in Numeric Topline .C ++ & Javascript
Die Idee ist:
C ++: http://codepad.org/SK2wbIDL
Javascript: Kopieren Sie einfach den Code in die Browserkonsole
Und eine Reihe von Korrekturen, um es zufrieden zu stellen
Von der Javascript-Seite:
Ändern
int
,main
oderputs
wird mit dem Lesen von nicht deklarierten Variablen zum Absturz bringen. Aberbool
undHi from C++!
kann sicher geändert werden. Lass es uns beheben:Wenn die Zeichenfolgen gleich sind, wird überprüft
bool
, ob sie vorhanden sind, andernfalls stürzt sie mit nicht deklarierten abnope
.Jetzt gibt es 2 nachgestellte Semikolons, die entfernt werden können. Das erste Problem wurde behoben - entfernen Sie einfach den Zeilenumbruch, bevor Sie Folgendes tun
int
:Die zweite ist vor
}
, also brauche ich eine Einschränkung, die in beiden Sprachen gültig ist und kein Semikolon am Ende in C ++ oder ein Semikolon in js erfordert. Fein:Es ist unmöglich, Semikolon in js wegzulassen, wie es
while
der Körper benötigt.Das Programm im Moment ist also:
Von C ++ Seite:
Es gibt 2 Probleme:
eval
kann einen beliebigen Namen haben und der gesamte js-Code kann geändert werden.Ich werde versuchen, sie in ein paar Tagen zu reparieren.
quelle
CJam + Golfscript
Okay, das ist etwas langweilig, aber es ist ein Anfang.
Gibt "0" in beiden Sprachen aus. Das Entfernen der
1
verursacht einen Fehler, das Entfernen der,
stattdessen Abdrücke "1".Das gleiche kann mit
1)
oder gemacht werden1(
. Es gibt viele Alternativen.(Ja, ich weiß, das ist kein Code-Golf)
quelle
C und C ++
C und C ++ sind verschiedene Sprachen, die fast miteinander kompatibel sind - im Gegensatz zu dem, was Sie vielleicht hören, ist C ++ keine Obermenge von C. Weitere Informationen zu einigen Unterschieden finden Sie unter http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B . Das obige Beispiel ist kein idiomatisches C ++, aber es funktioniert und erzeugt die gleiche Ausgabe in C und C ++.
quelle
0
für C.0
kann das entfernt werden.gcc -ansi
auf x86 (oder vielen anderen Architekturen: was , dass der Rückgabewert ist passiertputs
in dem Register bis zu sein endet , wo die Laufzeit liest den Wert von dermain
Funktion zurückkehren).JavaScipt, Lua, R und Python 3 - 24 Bytes
Kann auf einigen anderen Sprachen arbeiten, ich werde letztere testen.
JavaScript wurde auf der Firefox-Konsole und den anderen Sprachen getestet hier , hier und hier
quelle
Perl + Ruby + Python
Ich denke in PHP würde dies ein Semikolon benötigen, wenn Sie mit ausführen
-R
.quelle
Bash + sh + zsh + ksh, 4 Bytes:
Wirklich einfach und genügt jeder Regel:
quelle
Bash + sh + zsh + ksh + Windows Batch, 4 Bytes:
Wirklich einfach und genügt jeder Regel:
Gibt eine neue Zeile aus, die sich nicht in jeder Sprache unterscheidet (Windows Batch gibt jedoch
ECHO is on
in der von Ihnen verwendeten Sprache einen Fehler aus, es sei denn, ein Buchstabe wird entfernt oder geändert.quelle