20
1
Polyglots are programs that are valid in multiple programming languages simultaneously. Most such polyglots are written in such a way that certain constructs of one language are interpreted as comments of another language (e.g. #define
in C being interpreted as a comment in several scripting languages).
I am curious to see if it is possible to make a non-trivial polyglot which contains no comments, but also immediately changes when you remove any non-whitespace character, I therefore challenge you to come up with such a program.
The concrete rules are as follows:
- (Output). Your program must produce some output on the console under each of your languages. That is, your program is not permitted to simply exit without printing anything.
- (Variance). As a relaxation of the standard polyglot definition, the program's output may vary between languages.
- (Errors). Your program must not produce any errors (broadly defined) under any of your languages. For most languages, this is defined as returning a non-zero exit code from the compiler and/or interpreter.
- (Restriction). The removal of any single non-whitespace character from your code should cause your program to change its behaviour under every one of your languages. The program may "change" by becoming invalid for that language, or by changing the output that is produced.
- This is a code challenge. Winner is the program which is valid in the most programming languages. Ties will be broken in favor of shorter program length.
The restriction rule doesn't apply to the removal of several characters. That is, it is fine if removing several characters simultaneously results in no change for one of your languages.
Observe that the restriction rule implies that you cannot use Whitespace as one of your languages, as removing any non-whitespace character won't change the behaviour of the Whitespace program.
Here's a simple example of a program that fulfills all the above restrictions, for the languages Python 2 and Python 3:
print("Hello World!")
Removing any character in print
will cause both languages to throw a NameError
; removing any bracket or quote will throw a SyntaxError
, and removing any of the string characters will change the output in both languages. (Note that print("hello", "world")
is a more subtle, but still valid program under the above rules).
This example is a bit lame because Python 2 and Python 3 are very similar, so I won't accept any other solutions that only use different versions of the same language (especially Python 2 and Python 3).
@IngoBürk: The rule prevents you from writing a functional polyglot which involves Whitespace, unless somehow your other language is also whitespace-only. – nneonneo – 2014-09-28T00:49:59.660
1FWIW your example,
print("Hello World!")
is also valid Ruby code – Cristian Lupascu – 2014-09-28T12:38:58.153It's a little annoying that the simple answers (like mine) to a [polyglot] tend to be able to have so many languages. – Justin – 2014-09-28T19:40:20.823
5To avoid the myriad language variants or languages with similar syntax, it would be more interesting to require that two languages count as different only if the program produces different output. – Gilles 'SO- stop being evil' – 2014-09-29T12:09:35.093