Полиглоты - это программы, которые работают на нескольких языках программирования одновременно. Большинство таких полиглотов написаны таким образом, что определенные конструкции одного языка интерпретируются как комментарии другого языка (например, #define
в C интерпретируется как комментарий на нескольких языках сценариев).
Мне любопытно посмотреть, возможно ли создать нетривиальный полиглот, который не содержит комментариев, но также сразу же изменяется, когда вы удаляете любой символ, не являющийся пробелом, поэтому я призываю вас создать такую программу.
Конкретные правила заключаются в следующем:
- (Выход). Ваша программа должна выводить данные на консоль под каждый из ваших языков. То есть вашей программе не разрешается просто выходить без печати чего-либо.
- (Разница). В качестве ослабления стандартного определения полиглота выходные данные программы могут различаться в зависимости от языка.
- (ошибки). Ваша программа не должна давать никаких ошибок (в широком смысле) ни на одном из ваших языков. Для большинства языков это определяется как возвращение ненулевого кода завершения из компилятора и / или интерпретатора.
- (Ограничение). Удаление любого непробельного символа из вашего кода должно привести к тому, что ваша программа изменит свое поведение на каждом из ваших языков. Программа может «измениться», став недействительной для этого языка, или изменив произведенный вывод.
- Это проблема кода . Winner - это программа, которая действует на большинстве языков программирования. Связи будут разорваны в пользу более короткой программы.
Правило ограничения не распространяется на удаление нескольких символов. То есть хорошо, если удаление нескольких символов одновременно не приводит к изменениям для одного из ваших языков.
Обратите внимание, что правило ограничения подразумевает, что вы не можете использовать пробельные символы в качестве одного из ваших языков, так как удаление любого непробельного символа не изменит поведение программы пробельных символов.
Вот простой пример программы, которая удовлетворяет всем вышеперечисленным ограничениям для языков Python 2 и Python 3:
print("Hello World!")
Удаление любого символа print
приведет к тому, что оба языка выдают a NameError
; удаление любых скобок или кавычек приведет к выбрасыванию a SyntaxError
, а удаление любых строковых символов изменит вывод на обоих языках. (Обратите внимание, что print("hello", "world")
это более тонкая, но все еще действующая программа в соответствии с вышеуказанными правилами).
Этот пример немного неудачен, потому что Python 2 и Python 3 очень похожи, поэтому я не буду принимать никаких других решений, которые используют только разные версии одного и того же языка (особенно Python 2 и Python 3).
print("Hello World!")
также действительный код Ruby