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).
print("Hello World!")
ist auch gültiger Ruby-Code