Разве это не раздражает, когда вы находите кусок кода и не знаете, на каком языке он был написан? Этот вызов пытается несколько решить эту проблему.
Вызов
Вам нужно будет написать программу, которая при запуске на двух разных языках выведет строку:
This program wasn't written in <language program compiled/interpreted in>, it was built for <other language the program can be run in>!
В выходных данных названия языков должны иметь официальную прописную букву. например: CJam, C ++
Ни одна из программ не должна принимать никаких данных от пользователя.
При запуске на обоих языках вывод должен быть в стандартный вывод или эквивалентный.
Не должно быть никакого вывода на stderr ни в одной программе.
Вы можете использовать комментарии на любом языке.
Две разные версии одного и того же языка считаются разными языками.
Если это сделано, программа должна вывести основной номер версии, а если она запущена на двух разных второстепенных версиях, должна также сообщить младшую версию.
Вы не должны использовать встроенные функции версии (это включает переменные, которые уже были оценены во время выполнения).
Пример вывода:
Perl и Ruby:
Perl:
This program wasn't written in Perl, it was built for Ruby!
Рубин:
This program wasn't written in Ruby, it was built for Perl!
Python и C:
Python:
This program wasn't written in Python, it was built for C!
C:
This program wasn't written in C, it was built for Python!
Python 2 и Python 3:
Python 2:
This program wasn't written in Python 2, it was built for Python 3!
Python 3:
This program wasn't written in Python 3, it was built for Python 2!
Python 2.4 и Python 2.7:
Python 2.4:
This program wasn't written in Python 2.4, it was built for Python 2.7!
Python 2.7:
This program wasn't written in Python 2.7, it was built for Python 2.4!
Это кодовый гольф, поэтому выигрывает самый короткий код в байтах.
argv[0]
?Ответы:
Foo / CJam, 70 байт
В Foo, как выяснили многие, он просто печатает все в двойных кавычках и игнорирует большинство других символов или делает что-то, что не влияет на вывод в большинстве случаев. Короче говоря,
\@
ничего не делает, и все строки печатаются как есть.В CJam
\
меняет два верхних элемента и@
перемещает 3-й элемент в верхний, что позволяет расположить строки в правильном порядке. И после завершения программы все, что осталось в стеке, автоматически печатается.источник
R"This program wasn't written in ""Fission"", it was built for ""CJam"\@'!O
"This program wasn't written in Clip, it was built for CJam!"3{4-_36+e\}/
клип / CJam.C89 / C99,
171152136114111107105 байтСпасибо @Hurkyls, @Qwertiys, @ jimmy23013 и @MD XF за ваши советы.
версия для гольфа:
версия без золота:
Маленькое описание:
В предыдущих версиях C C99 был многострочный комментарий, подобный следующему:
с C99 был введен однострочный комментарий. нравится:
так что если вы скомпилируете строку, как это:
код для компиляции компилятора c99 будет выглядеть так:
в то время как соответствующий код для компилятора c89 будет:
(поскольку первый
/
не является частью комментария и поэтому считается оператором)источник
//**/
. В C89 это оператор деления, за которым следует пустой комментарий. В C99//
начинается однострочный комментарий, поэтому остальная часть строки пуста. Следовательно, в C89 оно становится(90-(-4.5/-4.5))
(90-(-4.5-4.5))
188-c
вместоc==99?89:99
.JavaScript / Ruby, 170 байт
Может быть только 2.0, кажется, не работает по крайней мере в 2.1.5 ... Редактировать: Обновления в соответствии с рекомендациями @Jordan, надеюсь, это работает еще в нескольких версиях сейчас!
Злоупотребляет
~
оператором в том, что Ruby будет обрабатываться=~
как совпадение с регулярным выражением, возвращая позицию первого совпадения в строке (0
), но JavaScript будет обрабатывать его как=
~/1/
есть-1
(поскольку/1/
преобразуется вNaN
для числовых операций, которые имеют0
значение).источник
NoMethodError: undefined method `log' for :log:Symbol
eval
возвращается:log
. Я думаю, что вы могли бы это исправить, поставив;c
послеend
.=~
/= ~
Трюк велик, хотя!$><<s
вместоputs s
двойных кавычек, вместо них можно использовать обратную косую чертуwasn\'t
.\'
с двойными кавычками, а$><<
значит, я могу применить упомянутое вами исправление и сохранить то же количество байтов!Python 2 / Python 3, 92
Использует «стандартную» проверку версии Python (целочисленное или поплавковое деление).
источник
Рыбалка / > <>
233217 байтРыбалка - это язык, в котором рыбаки ходят, ловят рыбу. Чтобы составить программу на этом языке, сначала нужно определить док, по которому он ходит. Док обеспечивает только поток управления для программы. Док в этой программе:
Всякий раз, когда
C
команда найдена, рыбак выбрасывает свою линию, чтобы поймать инструкцию.+
И-
инструкции уменьшить и увеличить длину его линии соответственно.v
меняет направление броска вниз. Рыба, которую он ловит в этой программе:> <> это язык, основанный на рыбе, движущейся по воде. Команда
v
начинает движение рыбы вниз, где она отражается с помощью команды вправо\
. Все между кавычками помещается в стек. После того, как нить помещена в стопку, рыба оборачивается на другую сторону, где она отражается вниз\
. Затем он выводит содержимое стека с помощью:источник
23 / Malbolge, 5688 байт
Обратите внимание, что программе требуется завершающий перевод строки. Ни одна строка не содержит конечных пробелов, поэтому копирование / вставка должно работать нормально.
верификация
Чтобы проверить код Malbolge в этом онлайн-интерпретаторе , вставьте его в область кода Malbolge и нажмите Load/Reset, затем Execute.
Чтобы протестировать код 23 в этом онлайн-интерпретаторе , вставьте его в область « Источник» , нажмите, Enterчтобы вставить конечный перевод строки, введите
23
в области « Консоль» (чтобы перейти от стандартной записи 23.dezsy к автоматическому определению) и нажмите Run Interpreter!.источник
Lua / C -
182164 байтаИспользует функцию, в которой Lua рассматривает хеш-метку в первой строке как комментарий, чтобы разрешить использование Unix-шебангов. В противном случае оборачивает комментарии другого языка в свои комментарии.
Чтобы сбрить байты, я полагаюсь на неявное поведение, которое выдает только предупреждения в GCC и Clang: неявное объявление int для основного и неявного определения printf.
источник
//
комментарий в части C? Сохраняет 2 байта.JavaScript / Haskell,
158 байт147 байтОбщая идея: проникнуть синтаксис каждого комментария в другой.
В одну строку:
Как это выглядит для Хаскелла:
Как это выглядит для JavaScript:
источник
alert
является игроком в гольф.Brainfuck / Foo, 769 байт
Очень сложный и сложный ответ ... или нет.
источник
,
за текста в конце. Я считаю, что это противоречит правилам назначения.,
просто устанавливает ячейку в 0, для EOFC / Python, 238 символов
Это не печатает 100% точно, что запрашивается, но довольно близко.
Перезагрузка моей валентинки .
источник
def
и:
послеdef main()
, и вы фактически не открываете тело функции для main. Вы на самом деле пытались составить свой ответ в C?#define def main(){0?
отсутствует#define return
заставляет меня немного плакать ...С / С ++, 136
Новые строки добавлены для форматирования. Попробуйте это на C или C ++ .
источник
struct{}s;z=2*sizeof s
Befunge / > <> ,
141138134133130 байт3 байта сохранены благодаря @Cole .
Если быть точным, я использую Befunge-98.
Используя факты, которые:
\
это зеркало в> <> и своп в Befunge'string'
это строка в> <> и'c
символ в Befungeисточник
?!;>ol
PHP / MySQL, 147 байт
источник
SELECT"This program wasn't written in MySQL, it was built for PHP!";
Python 3 / > <> ,
177173172167 байтСпасибо @mathmandan за сокращение 5 байт!
Ну, это был опыт, и опыт тоже. Любые предложения по гольфу приветствуются, так как это довольно долго. Я старался изо всех сил повторно использовать текст, но это было довольно сложно.
Технически, это был бы Python 3, который должна выводить эта программа (и я мог бы изменить это, если бы я не соответствовал спецификациям - но в примере был показан вывод Python / C
Python
).Попробуйте использовать онлайн> <> интерпретатор и Python 3 ( интерпретатор > <> требует, чтобы вы вводили код вручную)
Возвращает
в> <> и
в Python.
Объяснение (Python)
Для Python это довольно просто. Вот код, который нас интересует (в основном, код без комментариев, которые обозначены
#
в Python). Обратите внимание, что в Python\
это escape-символ, когда он используется в строках, поэтому\"
оценивается"
в строке.Больше всего нас интересуют операции над переменной
aa
:Таким образом, оператор print оценивает
Пояснение (> <>)
Теперь перейдем к более сложной части. Еще раз, вот код с удаленными ненужными битами.
Линия 1:
Стек прямо сейчас (если напечатано):
\This program wasn't written in
Строка 2:
Обратите внимание, что строка 2 начинается
/
с позиции указателя из строки 1 и перемещается справа налево.Стек прямо сейчас:
><> ni nettirw t'nsaw margorp sihT
Строка 3:
Как и предыдущая строка, эта начинается с
\
, где строка 2 отправляет указатель. Обратите внимание, что, поскольку указатель оборачивается вокруг строки, когда он достигает первой,a
я напишу свое объяснение в порядке, в котором указатель идет (и, следовательно, что выполняется)Стек прямо сейчас (
x
это символ, образованный добавлением «r» и пробела. - это не фактический символ, а просто заполнитель от меня):xof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
Строка 4:
Указатель просто продолжается вниз, поэтому эта строка не требует дальнейшего объяснения.
Строка 5:
Начиная с
/
и идти влево.Стек прямо сейчас (вывод обратный):
!nohtyP rof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
И это должно быть для объяснения. Дайте мне знать, если есть какое-либо несоответствие между объяснением / кодом или я сделал что-то не так; Я еще немного поиграл в коде, пока писал пояснения, так что я мог бы смешать немного старого и нового кода.
источник
aa[:-2][::-1]
наaa[-3::-1]
. В этом случае, конечно, это может помешать форматированию> <>, но, возможно, стоит подумать, если вы этого еще не сделали. В частности, я почти уверен, что вам нужен пробел нижеv
в предыдущей строке, но похоже, чтоprint(aa[-3::-1]+"Pytho"
он уместился бы в 24 символа нижеa=", it was built for "+
, и тогда вы могли бы поставить пробел с последующим+"n"+a)
. Я не уверен, что это сломает что-то еще, но если это сработает, это сэкономит несколько байтов.print aa[-3::-1]+"Pytho" +"n"+a
. Еще один вопрос: в версии> <>, что происходит с тем,1
что изначально было помещено в стек?Пакетный файл .BAT / Пакетный файл .CMD,
194185 байтРедактировать: Сохранено 9 байт и исправлено пропущенное
!
благодаря DLoscДа, есть различия между файлами BAT и CMD. Ссылка. По сути, CMD устанавливает команду
ERRORLEVEL
onSET
, в то время как BAT - нет, это означает, что здесьERRORLEVEL
установка с помощью неправильно сформированнойmd
команды очищаетсяSET v=1
в одной версии, а не в другой. Этот сценарий основан на примере, предоставленном "Ritchie" в этой теме группы новостей.Обратите внимание, что сокращенный скрипт выше
ENABLEEXTENSIONS
должен быть установленON
(он используется по умолчанию на каждой платформе). Расширенный сценарий ниже явно устанавливает его, чтобы гарантировать правильную работу. Без этогоSET
команда для CMD не разрешает все расширения, и (возможно, в некоторых системах) может установить ихERRORLEVEL
неправильно.Расширено и отмечено
источник
Javascript / C,
148146143 символовC:
http://codepad.org/u8UimGLchttp://codepad.org/Y80M5jpchttp://codepad.org/m4DB2NddJavascript: просто скопируйте код в консоль браузера
источник
CJam / GolfScript,
8178 байтОригинальная 81-байтовая версия:
источник
PHP / Perl,
9896 байтНе знаю, обманывает это или нет, поскольку, насколько я могу судить, единственный способ запустить PHP без открывающего
<?
тега - это что-то вродеphp -r $(cat codefile.php)
. Но если предположить, что это законно ...//
это комментарий PHP, но в Perl это регулярное выражение (которое само по себе не делает ничего). Остальное должно быть довольно понятным.Редактировать: теперь используя голое слово в части только для Perl. Я хотел использовать их в первую очередь для обоих языков, но PHP делает предупреждение, когда вы делаете это, в отличие от «Не должно быть вывода в stderr».
источник
<?'>#';
допустимый синтаксис на обоих языках.Рубин / Питон, 105 символов
источник
JavaScript 1,8 / JavaScript 1,7, 89 байт
Потому что Array.prototype.reduce является новым в 1.8
РЕДАКТИРОВАТЬ: Гольф 7 байтов путем непосредственной инициализации
a
вместо использованияreverse()
РЕДАКТИРОВАТЬ:
JavaScript
можно записать какJS
, сохраняя 8 байтовEDIT: Спасибо Хеди за указание на то , что я могу сохранить больше 3 байта , если я не использую переменную
b
большеРЕДАКТИРОВАТЬ: Гольф 6 байтов путем вычислений
7+a
и8-a
, где,a=1
если сокращение определено (JS 1.8) иa=0
если оно не определено (JS 1.7)РЕДАКТИРОВАТЬ: Хеди гольф 6 дополнительных байтов, предлагающих использование строки шаблона
РЕДАКТИРОВАТЬ: ETHproductions выложил 2 байта, предлагая
a=!![].reduce;
вместоa=[].reduce?1:0;
РЕДАКТИРОВАТЬ: no1xsyzy ударил еще один байт, предлагающий отменить булеву проверку
источник
a=[].reduce?1:0;
наa=!![].reduce;
.a
держать значение1
или0
нет,true
илиfalse
SWI-Пролог 6 / SWI-Пролог 7, 156 байт
Использует тот факт, что двойные кавычки
""
являются строковыми кодами (т. Е. Списком кодов символов) в версиях SWI-Prolog старше 7 и являются правильным типом String в версии 7.is_list("")
Таким образом, в версии 7 будет false, а в более ранних версиях - true.источник
BF / SPL, 5342 байта
Я почти уверен, что это первый полиглот Шекспира на языке программирования на этом сайте.
Вероятно, не собираюсь выигрывать какие-либо призы. Работает, вставляя код BF в заголовки актов / сцен / программ. Код SPL использует восклицательные знаки вместо точек, за исключением нескольких случаев. Программы не должны принимать входные данные, поэтому запятые в объявлениях символов «закомментированы» путем обнуления ячеек и заключения в квадратные скобки вокруг запятых. Та же процедура применяется, когда прячешь квадратные скобки вокруг операторов ввода / вывода.
Проверьте BF на https://repl.it/E8Hh/23 .
Код SPL был протестирован на компиляторе, найденном здесь: https://github.com/drsam94/Spl/ .
источник
Рубин 1,8 / Руби 1,9, 87
В Ruby 1.8
?9
это значение ASCII «9», которое равно 8 по модулю 49. В Ruby 1.9 это строка «9», и%49
это операция форматирования, которая ничего не делает, поскольку «9» не имеет строк формата в Это.источник
Python 2.7.9 / Python 2.7.10, 127 байт
У нас было несколько постов, в которых использовались второстепенные версии, но ни одна из них не перешла на следующий уровень ...
Попробуйте это на Ideone (Python 2.7.10) и repl.it (технически Python 2.7.2, но должен дать тот же результат, что и 2.7.9).
Python 2.7.10, согласно журналу изменений :
Это подтолкнуло
len(dir(types))
от 42 до 43, давая числовую разницу, которую мы можем использовать для получения желаемого результата.источник
Python / QBasic,
160142 байтаПротестировано с Python 3 и QBasic 1.1 . Не будет работать в Python 2 без добавления
from __future__ import print_function
в строку 4.1#
это выражение1
(no-op), за которым следует комментарий. В QBasic это номер строки (с суффиксом типа, помечающим его какDOUBLE
).DEFSTR
Утверждение говорит QBasic , что все переменные, имена которых начинаются сA
илиB
(без учета регистра) являются строковыми переменными. Таким образом, мы можем вызывать наши переменныеa
иb
вместоa$
иb$
(что не будет работать в Python).'
начинается комментарий. В Python''
это пустая строка (no-op). Затем мы меняем имена языков и определяем псевдоним дляprint
функции (поскольку ключевые слова QBasic автоматически форматируются в верхний регистр).Если мне разрешено отключить автоформатор (который является опцией в QB64 , но не в оригинальном QBasic), я могу уменьшить его до 114 байт с помощью Python 2 :
источник
Perl / Ruby, 129 байт
В этом нет никакого злоупотребления регулярным выражением, просто используется тот факт, что 0 является правдоподобным в Ruby для
eval
определенияsort
(которое на самом делеreverse
s) иprintf
ing. Руби не нравилось использовать список аргументов, поэтому мне приходилось делать каждый из них в отдельности.источник
a
должна быть переменная экземпляра, а не локальная?@
Сигил для переменной в Perl означает, что это список, в Perl хранение, скажем,$a
вместо этого, не приводит к выводу./// и Retina , 95 + 3 = 98 байт
+3 байта за
-s
флаг в сетчатке.Объяснение для ///
Первая инструкция
удаляет все новые строки из остальной части кода, в результате чего
Все вплоть до
!
буквального и напечатано в STDOUT. Следующая инструкцияНо строка поиска
?.
не может быть найдена, поэтому ничего не происходит. Тогда оставшийся код//!
является неполной инструкцией, поэтому программа завершается, напечатав правильную строку.Объяснение для сетчатки
Это говорит Retina для замены
/
на//
. Но вход пуст, так что ничего не совпадает.Это заменяет ввод строкой во второй строке.
Это соответствует строке
\/\/\/, it was built for Retina!
и заменяет ее,Retina, it was built for ///!
чтобы дать правильный результат.источник
-s
, хотя, сказав, что я сделал, испортило веселье! : Dsed / Hexagony 251 Bytes
sed: попробуйте онлайн!
Гексагония: Попробуйте онлайн!
В sed он печатает правильную строку, если совпадает с пустой строкой в конце (всегда). Вторая строка - это комментарий. Для этого требуется строка в STDIN, но она может быть пустой ( допускается на основе этого консенсуса ).
Пример:
В Hexagony, первый
/
перенаправляет в нижний левый угол, он следует за левой стороной до того места, где начинается sed, затем просто переносится слева направо, вниз по линии, справа налево, вниз по линии и так далее. Расширенный гекс выглядит так:источник
;
для определения значения байта используется текущий мод ячейки 256 (например, вы можете напечатать пробелP0;
независимо от текущего значения ячейки). Этот сценарий CJam генерирует все пары: cjam.tryitonline.net/…Python / Retina,
133120119117115 байтТеперь, когда я знаю больше о Retina и регулярных выражениях, я стал играть в нее немного больше. Это также на самом деле работает сейчас.
Python просто печатает заявление. Retina заменяет что-либо с помощью оператора печати Python, затем удаляет
print
и все кавычки. Затем я поменятьPython
иRetina
и удалить#
.Попробуй в Python | Попробуй в Retina
источник
JavaScript / CoffeeScript,
125124 байтаВ CoffeeScript
a==b
компилируется доa===b
, что делает промежуточное условие ложным. Я использовал немного магии, чтобы преобразовать логическое значение в целое число.Сохранено 1 байт благодаря @DomHastings!
125-байтовая версия:
источник
+(b=0=='0')
вместо+0
!b^1
, я думаю, вы можете использовать~b
undefinedScript
.~1 == -2
. Но(b=0=='0')+0
можно записать как+(b=0=='0')
. Илиb=+(0=='0')
. Это должно отрезать 1 байт.