Полиглоты - это программы, которые работают на нескольких языках программирования одновременно. Большинство таких полиглотов написаны таким образом, что определенные конструкции одного языка интерпретируются как комментарии другого языка (например, #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Ответы:
Bash + GolfScript + CJam
Выход
Bash:
GolfScript:
CJam:
В
\x7f
конце вывода CJam есть.источник
Bash + Befunge
печатает «привет» в befunge.
источник
до н.э., GolfScript, Homespring, да, октава, Scilab (0 байт)
Гарантируется соблюдение правила 4. Не победитель, но преуспеет в тай-брейке.
Выход
До нашей эры
GolfScript
Homespring
хм
октава
Scilab
источник
What?\n?
Кстати, ваша программа печатает .make: *** No targets. Stop.
GolfScript + PHP + CJam + Mathematica + BC + Pyth + /// + TI-Basic + R + Октава + Matlab + Scilab + Числовая линия верха +? Fueue + а?
В Golscript, PHP, CJam, Mathematica, BC, Pyth, /// и TI-Basic он выводит
10
.В R это выводит
[1] 10
В октаве выводит
ans = 10
В Matlab и Scilab он выводит
ans = 10
.В Numeric Topline это выводит
0
.Если я правильно понимаю Fueue, он выводит новую строку, а затем действует как программа cat.
В да ?, это выводит
источник
72
на10
, он должен печататься0
в Numeric Topline .C ++ и Javascript
Идея заключается в следующем:
C ++: http://codepad.org/SK2wbIDL
Javascript: просто скопируйте код в консоль браузера
И набор исправлений, чтобы он удовлетворял
Со стороны Javascript:
Изменение
int
,main
илиputs
произойдет сбой при чтении необъявленной переменной. Ноbool
иHi from C++!
можно смело меняться. Давайте исправим это:Если строки равны, он проверяет существование
bool
, в противном случае он падает с необъявленнымnope
.Теперь есть две конечные точки с запятой, которые можно удалить. Первое исправлено, просто удалите символ новой строки перед
int
:Второе - раньше
}
, поэтому мне нужны некоторые ограничения, допустимые на обоих языках и не требующие точки с запятой в конце в C ++ или использования точки с запятой в js. Штраф:Невозможно опустить точку с запятой в js, так как
while
необходимо тело.Итак, программа на данный момент это:
Со стороны C ++:
Есть 2 проблемы:
eval
может иметь любое имя и весь код js может быть изменен.Я постараюсь исправить их через несколько дней.
источник
CJam + Golfscript
Хорошо, это немного скучно, но это начало.
Выводит «0» на обоих языках. Удаление
1
приводит к ошибке, удаляя,
отпечатки "1" вместо.То же самое можно сделать с помощью
1)
или1(
. Есть много альтернатив.(Да, я знаю, что это не код-гольф)
источник
C и C ++
C и C ++ - это разные языки, которые почти совместимы друг с другом - вопреки тому, что вы могли слышать, C ++ не является надмножеством языка C. Посмотрите на http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B некоторые различия , Приведенный выше пример не является идиоматическим C ++, но он работает и выдает одинаковый вывод как на C, так и на C ++.
источник
0
для C.0
можно удалить.gcc -ansi
завершения , такой как на x86 (или на многих других архитектурах: что происходит, когда возвращаемое значение вputs
конечном итоге оказывается в регистре, где среда выполнения считывает значение вернуться изmain
функции).JavaScipt, Lua, R и Python 3 - 24 байта
Может работать на некоторых других языках, я проверю последний.
JavaScript был протестирован на консоли Firefox и других языках здесь , здесь и здесь
источник
Perl + Ruby + Python
Я думаю, что в PHP это потребует точки с запятой, если вы работаете с
-R
.источник
Баш + ш + зш + кш, 4 байта:
Действительно прост и удовлетворяет каждому правилу:
источник
Bash + sh + zsh + ksh + Windows Batch, 4 байта:
Действительно прост и удовлетворяет каждому правилу:
Вывод новой строки, которая не изменяется на каждом из языков (но пакет Windows, который выводит
ECHO is on
на используемом вами языке), не выдает ошибку, за исключением случаев, когда любая буква удалена или изменена.источник