Eingeschränkte Mehrsprachigkeit


20

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 #defineC 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:

  1. (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.
  2. (Varianz). Als eine Lockerung der Standard-Polyglot-Definition kann die Ausgabe des Programms zwischen den Sprachen variieren.
  3. (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.
  4. (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.
  5. 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 printbewirkt, 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).


@ IngoBürk: Die Regel verhindert, dass Sie einen funktionalen Polyglot schreiben, der Whitespace enthält, es sei denn, Ihre andere Sprache enthält ebenfalls Whitespace.
Nneonneo

1
FWIW Ihr Beispiel print("Hello World!")ist auch gültiger Ruby-Code
Cristian Lupascu

Es ist ein wenig ärgerlich, dass die einfachen Antworten (wie meine) auf einen [Vielsprachigen] dazu neigen, so viele Sprachen zu beherrschen.
Justin

5
Um die unzähligen Sprachvarianten oder Sprachen mit ähnlicher Syntax zu vermeiden, wäre es interessanter zu fordern, dass zwei Sprachen nur dann als unterschiedlich gelten, wenn das Programm unterschiedliche Ausgaben erzeugt.
Gilles 'SO - hör auf böse zu sein'

Antworten:


13

Bash + GolfScript + CJam

"echo" []
{ cat<&3;} \
3<""<("echo" 'p'~)

Ausgabe

Bash:

[]
p~

GolfScript:

"echo"
echo{ cat<&3;}0

CJam:

echo{ cat<&3;}-1echop

Da ist ein \x7f Ende der Ausgabe von CJam.


... warte, wie funktioniert das in allen drei Sprachen, ohne redundant zu sein?
Nneonneo

@nneonneo Es wird einfach der gesamte nicht verwendete Code in anderen Sprachen gedruckt.
Jimmy23013

8

Bash + Befunge

"echo" $,$,"ol":,,,@

druckt "Hallo" in befunge.


1
Ich kann bezeugen, dass jeder Charakter (außer dem Leerzeichen) in Befunge etwas tut. Für die Bash kann ich das aber nicht. Das ist beeindruckend.
Justin

7

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

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

GolfScript


Homespring

In Homespring, the null program is not a quine.

huh

?

Oktave

GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

Scilab

Startup execution:
  loading initial environment

-->

2
Ich weiß, dass es einen Esolang gibt, der speziell Quines mit einer Länge von 0 verhindert, indem er so etwas macht (oh warte, das ist Homespring ). Ich glaube nicht wahr? gibt etwas aus.
Justin

Vielen Dank! Leider kann ich nicht überzeugen, oder? läuft unter Linux ...
Dennis

1
Ich brauchte nur ein zusätzliches Paket für Mono. Ihr Programm What?\n?wird übrigens gedruckt .
Dennis

1
Funktioniert auch in GNU Make (wenn das eine Programmiersprache ist):make: *** No targets. Stop.
jimmy23013

1
@ user23013: Richtig. In diesem Fall handelt es sich nicht um eine gültige Eingabe, da der
Dennis,

6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Oktave + Matlab + Scilab + Numerische Topline +? Fueue + huh?

10

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

What?
?

1
Arbeitet auch in CJam
August

5
Ich denke nicht, dass interaktive Dolmetscher zählen sollten.
Nneonneo

2
Dies funktioniert gut in vielen Sprachen, bietet aber keine Ausgabe in so vielen ...
Justin

1
Dies gilt auch für HTML , bc , Matlab und Scilab . Wenn Sie ändern 72zu 10, sollte es gedruckt 0in Numeric Topline .
Dennis

HTML ist keine Programmiersprache gemäß der Metadiskussion, da es keine Mittel für einfache Arithmetik oder Schleifen gibt.
Ingo Bürk

3

Diese Antwort scheint nicht ganz richtig zu sein.
Ich habe es teilweise behoben und werde den anderen Teil in ein paar Tagen verbessern.

C ++ & Javascript

Die Idee ist:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");
int
main()
{
puts("Hi from C++!");
}

C ++: http://codepad.org/SK2wbIDL
Javascript: Kopieren Sie einfach den Code in die Browserkonsole

Und eine Reihe von Korrekturen, um es zufrieden zu stellen

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

Von der Javascript-Seite:

Ändern int, mainoder putswird mit dem Lesen von nicht deklarierten Variablen zum Absturz bringen. Aber boolund Hi from C++!kann sicher geändert werden. Lass es uns beheben:

puts=function(){}
puts=function(s){s=='Hi from C++!'?bool:nope}

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:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");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:

while(0);

Es ist unmöglich, Semikolon in js wegzulassen, wie es whileder Körper benötigt.

Das Programm im Moment ist also:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(s){s=='Hi from C++!'?bool:nope};int=0");int
main()
{
puts("Hi from C++!");while(0);
}

Von C ++ Seite:

Es gibt 2 Probleme: evalkann einen beliebigen Namen haben und der gesamte js-Code kann geändert werden.

Ich werde versuchen, sie in ein paar Tagen zu reparieren.


2

CJam + Golfscript

Okay, das ist etwas langweilig, aber es ist ein Anfang.

1,

Gibt "0" in beiden Sprachen aus. Das Entfernen der 1verursacht einen Fehler, das Entfernen der, stattdessen Abdrücke "1".

Das gleiche kann mit 1)oder gemacht werden 1(. Es gibt viele Alternativen.

(Ja, ich weiß, das ist kein Code-Golf)


2

C und C ++

#include <stdio.h>
int main() { puts("Hello!"); return 0; }

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


Sie können das 0für C.
Dennis

@ Tennis Nicht in C89.
Gilles 'SO - hör auf, böse zu sein'

@Gilles: Wenn die Hauptfunktion eine Rückgabe ausführt, die keinen Wert angibt, ist der an die Host-Umgebung zurückgegebene Beendigungsstatus undefiniert. ( The C89 Draft - 2.1.2.2 Hosted Environment ) Das macht das Programm weder ungültig noch ändert es seine Ausgabe. Für die Zwecke dieser Frage 0kann das entfernt werden.
Dennis

@ Tennis Ich denke, ein nicht spezifizierter Exit-Code macht das Programm nach den Regeln dieser Frage ungültig. Wenn nicht, macht , dass eine C89 - Implementierung , bei diesem Programm eines von Null verschiedenen Exit - Code zurückgibt, wie gcc -ansiauf x86 (oder vielen anderen Architekturen: was , dass der Rückgabewert ist passiert putsin dem Register bis zu sein endet , wo die Laufzeit liest den Wert von der mainFunktion zurückkehren).
Gilles 'SO - hör auf böse zu sein'

@ Gilles: Meine Interpretation von Regel 3 ist, dass der Compiler 0 zurückgeben muss, nicht das Programm.
Dennis

2

JavaScipt, Lua, R und Python 3 - 24 Bytes

Kann auf einigen anderen Sprachen arbeiten, ich werde letztere testen.

alert=print;alert(1)

JavaScript wurde auf der Firefox-Konsole und den anderen Sprachen getestet hier , hier und hier


1

Perl + Ruby + Python

Ich denke in PHP würde dies ein Semikolon benötigen, wenn Sie mit ausführen -R.

print "Hello World!"

Dies funktioniert auch in Python.
August

1
Funktioniert auch mit Lua.
Trebuchette,

1

Bash + sh + zsh + ksh, 4 Bytes:

echo

Wirklich einfach und genügt jeder Regel:

  1. Gibt eine neue Zeile in jeder Sprache aus.
  2. Ausgang zur Zeit nicht nicht unterscheiden sich in keiner Weise zwischen den Sprachen.
  3. Erzeugt keinen Fehler in einer der Sprachen ...
  4. ... außer wenn eines der Zeichen entfernt / geändert wird.

0

Bash + sh + zsh + ksh + Windows Batch, 4 Bytes:

echo

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 onin der von Ihnen verwendeten Sprache einen Fehler aus, es sei denn, ein Buchstabe wird entfernt oder geändert.


1
Ihre Antwort scheint fast identisch zu sein: codegolf.stackexchange.com/a/100654/65326
Uriel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.