Ограниченный полиглот

20

Полиглоты - это программы, которые работают на нескольких языках программирования одновременно. Большинство таких полиглотов написаны таким образом, что определенные конструкции одного языка интерпретируются как комментарии другого языка (например, #defineв C интерпретируется как комментарий на нескольких языках сценариев).

Мне любопытно посмотреть, возможно ли создать нетривиальный полиглот, который не содержит комментариев, но также сразу же изменяется, когда вы удаляете любой символ, не являющийся пробелом, поэтому я призываю вас создать такую ​​программу.

Конкретные правила заключаются в следующем:

  1. (Выход). Ваша программа должна выводить данные на консоль под каждый из ваших языков. То есть вашей программе не разрешается просто выходить без печати чего-либо.
  2. (Разница). В качестве ослабления стандартного определения полиглота выходные данные программы могут различаться в зависимости от языка.
  3. (ошибки). Ваша программа не должна давать никаких ошибок (в широком смысле) ни на одном из ваших языков. Для большинства языков это определяется как возвращение ненулевого кода завершения из компилятора и / или интерпретатора.
  4. (Ограничение). Удаление любого непробельного символа из вашего кода должно привести к тому, что ваша программа изменит свое поведение на каждом из ваших языков. Программа может «измениться», став недействительной для этого языка, или изменив произведенный вывод.
  5. Это проблема кода . Winner - это программа, которая действует на большинстве языков программирования. Связи будут разорваны в пользу более короткой программы.

Правило ограничения не распространяется на удаление нескольких символов. То есть хорошо, если удаление нескольких символов одновременно не приводит к изменениям для одного из ваших языков.

Обратите внимание, что правило ограничения подразумевает, что вы не можете использовать пробельные символы в качестве одного из ваших языков, так как удаление любого непробельного символа не изменит поведение программы пробельных символов.

Вот простой пример программы, которая удовлетворяет всем вышеперечисленным ограничениям для языков Python 2 и Python 3:

print("Hello World!")

Удаление любого символа printприведет к тому, что оба языка выдают a NameError; удаление любых скобок или кавычек приведет к выбрасыванию a SyntaxError, а удаление любых строковых символов изменит вывод на обоих языках. (Обратите внимание, что print("hello", "world")это более тонкая, но все еще действующая программа в соответствии с вышеуказанными правилами).

Этот пример немного неудачен, потому что Python 2 и Python 3 очень похожи, поэтому я не буду принимать никаких других решений, которые используют только разные версии одного и того же языка (особенно Python 2 и Python 3).

nneonneo
источник
@ IngoBürk: Правило запрещает вам писать функциональный полиглот, включающий пробелы, если только ваш другой язык также не предназначен только для пробелов.
nneonneo
1
FWIW ваш пример, print("Hello World!")также действительный код Ruby
Кристиан Лупаску
Немного раздражает, что простые ответы (например, мои) на полиглот, как правило, могут иметь так много языков.
Джастин
5
Чтобы избежать множества вариантов языков или языков с похожим синтаксисом, было бы более интересно потребовать, чтобы два языка считались разными, только если программа выдает разный вывод.
Жиль "ТАК - перестать быть злым"

Ответы:

13

Bash + GolfScript + CJam

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

Выход

Bash:

[]
p~

GolfScript:

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

CJam:

echo{ cat<&3;}-1echop

В \x7fконце вывода CJam есть.

jimmy23013
источник
... подождите, как это работает на всех трех языках, не будучи лишним?
nneonneo
@nneonneo Он просто печатает весь неиспользуемый код на других языках.
jimmy23013
8

Bash + Befunge

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

печатает «привет» в befunge.

saeedn
источник
1
Я могу засвидетельствовать, что каждый персонаж (кроме пробела) что-то делает в Befunge. Я не могу сделать это для Bash, хотя. Это впечатляет.
Джастин
7

до н.э., GolfScript, Homespring, да, октава, Scilab (0 байт)

Гарантируется соблюдение правила 4. Не победитель, но преуспеет в тай-брейке.

Выход

До нашей эры

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.

хм

?

октава

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
Я знаю, что есть esolang, который специально предотвращает квины нулевой длины, выполняя подобные вещи (о, подождите, это Homespring ). Я верю, а? выводит что-то.
Джастин
Благодарность! К сожалению, я не могу убедить, да? работать на Linux ...
Деннис
1
Все, что мне было нужно, это дополнительный пакет для моно. What?\n?Кстати, ваша программа печатает .
Деннис
1
Также работает в GNU Make (если это язык программирования):make: *** No targets. Stop.
jimmy23013
1
@ user23013: Верно. В этом случае это недействительная запись, поскольку код выхода make равен 2.
Деннис
6

GolfScript + PHP + CJam + Mathematica + BC + Pyth + /// + TI-Basic + R + Октава + Matlab + Scilab + Числовая линия верха +? Fueue + а?

10

В Golscript, PHP, CJam, Mathematica, BC, Pyth, /// и TI-Basic он выводит 10.

В R это выводит [1] 10

В октаве выводит ans = 10

В Matlab и Scilab он выводит ans = 10.

В Numeric Topline это выводит 0.

Если я правильно понимаю Fueue, он выводит новую строку, а затем действует как программа cat.

В да ?, это выводит

What?
?
Джастин
источник
1
Также работает в CJam
август
5
Я не думаю, что интерактивные переводчики должны рассчитывать.
nneonneo
2
Это хорошо работает на многих языках, но не обеспечивает вывод на таком количестве ...
Джастин
1
Это также действует в HTML , bc , Matlab и Scilab . Если вы измените 72на 10, он должен печататься 0в Numeric Topline .
Деннис
Согласно мета-дискуссии, HTML не является языком программирования, так как он не имеет средств простой арифметики или циклов.
Инго Бюрк
3

Похоже, этот ответ не совсем правильный.
Я частично исправил это, и собираюсь улучшить другую часть через несколько дней.

C ++ и Javascript

Идея заключается в следующем:

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: просто скопируйте код в консоль браузера

И набор исправлений, чтобы он удовлетворял

(Ограничение). Удаление любого непробельного символа из вашего кода должно привести к тому, что ваша программа изменит свое поведение на каждом из ваших языков. Программа может «измениться», став недействительной для этого языка, или изменив произведенный вывод.

Со стороны Javascript:

Изменение int, mainили putsпроизойдет сбой при чтении необъявленной переменной. Но boolи Hi from C++!можно смело меняться. Давайте исправим это:

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

Если строки равны, он проверяет существование bool, в противном случае он падает с необъявленным nope.

Теперь есть две конечные точки с запятой, которые можно удалить. Первое исправлено, просто удалите символ новой строки перед int:

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

Второе - раньше }, поэтому мне нужны некоторые ограничения, допустимые на обоих языках и не требующие точки с запятой в конце в C ++ или использования точки с запятой в js. Штраф:

while(0);

Невозможно опустить точку с запятой в js, так как whileнеобходимо тело.

Итак, программа на данный момент это:

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);
}

Со стороны C ++:

Есть 2 проблемы: evalможет иметь любое имя и весь код js может быть изменен.

Я постараюсь исправить их через несколько дней.

Qwertiy
источник
2

CJam + Golfscript

Хорошо, это немного скучно, но это начало.

1,

Выводит «0» на обоих языках. Удаление 1приводит к ошибке, удаляя ,отпечатки "1" вместо.

То же самое можно сделать с помощью 1)или 1(. Есть много альтернатив.

(Да, я знаю, что это не код-гольф)

Инго Бюрк
источник
2

C и C ++

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

C и C ++ - это разные языки, которые почти совместимы друг с другом - вопреки тому, что вы могли слышать, C ++ не является надмножеством языка C. Посмотрите на http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B некоторые различия , Приведенный выше пример не является идиоматическим C ++, но он работает и выдает одинаковый вывод как на C, так и на C ++.

Джерри Иеремия
источник
Вы можете удалить 0для C.
Деннис
@ Денис Не в C89.
Жиль "ТАК - перестань быть злым"
@Gilles: если основная функция выполняет возврат, который не указывает значения, статус завершения, возвращаемый в среду хоста, не определен. ( Черновик C89 - 2.1.2.2. Размещенная среда ). Это не делает программу недействительной и не меняет ее вывод, поэтому для целей этого вопроса ее 0можно удалить.
Деннис
@ Денис Я думаю, что неопределенный код выхода считается недействительным в соответствии с правилами этого вопроса. Если это не так, сделайте это реализацией C89, где эта программа возвращает ненулевой код gcc -ansiзавершения , такой как на x86 (или на многих других архитектурах: что происходит, когда возвращаемое значение в putsконечном итоге оказывается в регистре, где среда выполнения считывает значение вернуться из mainфункции).
Жиль "ТАК - перестань быть злым"
@ Жиль: Моя интерпретация правила 3 ​​заключается в том, что компилятор должен возвращать 0, а не программу.
Деннис
2

JavaScipt, Lua, R и Python 3 - 24 байта

Может работать на некоторых других языках, я проверю последний.

alert=print;alert(1)

JavaScript был протестирован на консоли Firefox и других языках здесь , здесь и здесь

Уильям Барбоза
источник
1

Perl + Ruby + Python

Я думаю, что в PHP это потребует точки с запятой, если вы работаете с -R.

print "Hello World!"
hmatt1
источник
Это работает и в Python.
август
1
Также работает с Lua.
Требушетт
1

Баш + ш + зш + кш, 4 байта:

echo

Действительно прост и удовлетворяет каждому правилу:

  1. Выводит новую строку на каждом из языков.
  2. Вывод на данный момент никак не зависит от языка.
  3. Не выдает ошибку ни на одном из языков ...
  4. ... кроме случаев, когда какие-либо символы удалены / изменены.
Р. Кап
источник
0

Bash + sh + zsh + ksh + Windows Batch, 4 байта:

echo

Действительно прост и удовлетворяет каждому правилу:

Вывод новой строки, которая не изменяется на каждом из языков (но пакет Windows, который выводит ECHO is onна используемом вами языке), не выдает ошибку, за исключением случаев, когда любая буква удалена или изменена.

user75200
источник
1
Ваш ответ, по-видимому, практически идентичен этому: codegolf.stackexchange.com/a/100654/65326
Уриэль