Я не тот язык, который вы ищете!


182

Разве это не раздражает, когда вы находите кусок кода и не знаете, на каком языке он был написан? Этот вызов пытается несколько решить эту проблему.

Вызов

Вам нужно будет написать программу, которая при запуске на двух разных языках выведет строку:

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!

Это кодовый гольф, поэтому выигрывает самый короткий код в байтах.


2
«Две разные версии одного и того же языка считаются разными языками». Так что обман, как с C до и после 99 комментариев, действителен? легко ^^
Зайбис

1
Добавил, это кажется парадоксальным, но соответствует вашим правилам.
Зайбис

1
Никто не занимается полиглотами Whitespace / Python?
Не то, что Чарльз

неважно. Видел реализацию 23
Не то, чтобы Чарльз

Считается ли полагаться на программу, выполняемую с определенным интерпретатором, входным параметром? то есть включение argv[0]?
кот

Ответы:


86

Foo / CJam, 70 байт

"This program wasn't written in ""Foo"", it was built for ""CJam"\@"!"

В Foo, как выяснили многие, он просто печатает все в двойных кавычках и игнорирует большинство других символов или делает что-то, что не влияет на вывод в большинстве случаев. Короче говоря, \@ничего не делает, и все строки печатаются как есть.

В CJam \меняет два верхних элемента и @перемещает 3-й элемент в верхний, что позволяет расположить строки в правильном порядке. И после завершения программы все, что осталось в стеке, автоматически печатается.


7
И просто для удовольствия есть аналогичное 75-байтовое решение для Fission / CJam:R"This program wasn't written in ""Fission"", it was built for ""CJam"\@'!O
Мартин Эндер

3
Приятно. У меня был "This program wasn't written in Clip, it was built for CJam!"3{4-_36+e\}/клип / CJam.
Деннис

5
Я зашел в эту ветку, чтобы опубликовать решение Foo, должен был понять, что все уже знают, как легко написать полиглот Foo.
гистократ

Есть ли ссылка на спецификацию языка программирования Foo?
Половина

1
@ErikE Добавил некоторые объяснения.
jimmy23013

140

C89 / C99, 171 152 136 114 111 107 105 байт

Спасибо @Hurkyls, @Qwertiys, @ jimmy23013 и @MD XF за ваши советы.

версия для гольфа:

c;main(){c=-4.5//**/
-4.5;printf("This program wasn't written in C%d, it was built for C%d!",90-c,98+c);}

версия без золота:

c;

main()
{
    c = -4.5//**/
    -4.5;
    printf("This program wasn't written in C%d, it was built for C%d!",90-c,98+c);
}

Маленькое описание:

В предыдущих версиях C C99 был многострочный комментарий, подобный следующему:

/*foo*/

с C99 был введен однострочный комментарий. нравится:

//foo

так что если вы скомпилируете строку, как это:

c =-4.5//**/
-4.5;

код для компиляции компилятора c99 будет выглядеть так:

c = -4.5 -4.5;

в то время как соответствующий код для компилятора c89 будет:

(поскольку первый /не является частью комментария и поэтому считается оператором)

c = -4.5 / -4.5;

10
+1 за чудесный ответ. Немного объяснений для тех, кто не знаком с Си, было бы неплохо.
ace_HongKongIndependence

4
@ace Я полагаю, что это зависит от комментариев в стиле C99. В четвертой строке обратите внимание на //**/. В C89 это оператор деления, за которым следует пустой комментарий. В C99 //начинается однострочный комментарий, поэтому остальная часть строки пуста. Следовательно, в C89 оно становится (90-(-4.5/-4.5))(90-(-4.5-4.5))
равным

14
Чтобы сохранить несколько байтов, используйте 188-cвместо c==99?89:99.

1
Я не думаю, что вам нужно пространство и внешние скобки с заданием.
PurkkaKoodari


88

JavaScript / Ruby, 170 байт

Может быть только 2.0, кажется, не работает по крайней мере в 2.1.5 ... Редактировать: Обновления в соответствии с рекомендациями @Jordan, надеюсь, это работает еще в нескольких версиях сейчас!

a='1';c=console=console||eval('def c.log s;$><<s end;c');c.log("This program wasn't written in "+(d=['JavaScript','Ruby'])[b= ~(a=~/1/)]+', it was built for '+d[b+1]+'!')

Злоупотребляет ~оператором в том, что Ruby будет обрабатываться =~как совпадение с регулярным выражением, возвращая позицию первого совпадения в строке ( 0), но JavaScript будет обрабатывать его как = ~/1/есть -1(поскольку /1/преобразуется в NaNдля числовых операций, которые имеют 0значение).


Этот ответ не работает для меня в Ruby 2.1.5. Я получаю:NoMethodError: undefined method `log' for :log:Symbol
ЭМБЛЕМА

@EMBLEM Мое тестирование проводилось на Ruby 2.0, встроенном в OS X, я не тестировал ничего, кроме этого, но я обязательно добавлю комментарий, указывающий, что он может быть поврежден в другой версии!
Дом Гастингс

В более поздних версиях Ruby определение метода возвращает имя метода в виде символа, поэтому ваш evalвозвращается :log. Я думаю, что вы могли бы это исправить, поставив ;cпосле end. =~/ = ~Трюк велик, хотя!
Иордания

Вы также можете сохранить. Несколько байтов $><<sвместо puts sдвойных кавычек, вместо них можно использовать обратную косую черту wasn\'t.
Иордания

@ Джордан Спасибо! Не уверен, что я не заметил удаление \'с двойными кавычками, а $><<значит, я могу применить упомянутое вами исправление и сохранить то же количество байтов!
Дом Гастингс

82

Python 2 / Python 3, 92

Использует «стандартную» проверку версии Python (целочисленное или поплавковое деление).

print("This program wasn't written in Python %d, it was built for Python %d!"%(3/2*2,4-3/2))

3
Об этом говорили в песочнице, и консенсус должен был разрешить подобные вещи
Blue

14
@ Flawr Будут ли разрешены Python и Cobra? ;)
Бета-распад

7
@flawr Python на самом деле назван в честь комедийной группы ~~ богов, Монти Пайтон.
Мутанто

@Mutantoe Вам может показаться, что «Монти» не является именем животного, каламбур не сработает.
Пьер Арло

57

Рыбалка / > <> 233 217 байт

v++C-CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC+CCCCCCC-CCCCCCCCCCCCCCCCCCC+CCCCCC
\   "This program wasn't written in ""><>"  ", it was built for Fishing!"
>r!`ol?!;32.                         Fishing                     ><>!`N

Рыбалка - это язык, в котором рыбаки ходят, ловят рыбу. Чтобы составить программу на этом языке, сначала нужно определить док, по которому он ходит. Док обеспечивает только поток управления для программы. Док в этой программе:

v++C-CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC+CCCCCCC-CCCCCCCCCCCCCCCCCCC+CCCCCC

Всякий раз, когда Cкоманда найдена, рыбак выбрасывает свою линию, чтобы поймать инструкцию. +И -инструкции уменьшить и увеличить длину его линии соответственно. vменяет направление броска вниз. Рыба, которую он ловит в этой программе:

`This program wasn't written in Fishing, it was built for ><>!`N

> <> это язык, основанный на рыбе, движущейся по воде. Команда vначинает движение рыбы вниз, где она отражается с помощью команды вправо \. Все между кавычками помещается в стек. После того, как нить помещена в стопку, рыба оборачивается на другую сторону, где она отражается вниз \. Затем он выводит содержимое стека с помощью:

>r!`ol?!;32.

Вы можете уменьшить свой код на 13 байт, поместив цикл печати для> <> в пробел в третьей строке (я не думаю, что это будет мешать части рыбалки, хотя я не знаю этот язык). Я не уверен, как этот комментарий будет обрабатывать весь код, поэтому вот ссылка на hastebin: hastebin.com/quqinozizi (я, возможно, испортил интервал в третьей строке, но я думаю, что все выровнено правильно).
Коул

@Cole Это работает. На самом деле ваше предложение фактически удаляет 16 символов.
TheNumberOne

14
Рыба и рыболовный полиглот ... возможно, первый в своем роде!
Марк К Коуэн

это так смешно что!
D.Tate

55

23 / Malbolge, 5688 байт

                    bCBA@?>=<;:987
                                                                                        6543210/.-,+*)
                                                                                          ('&%$#"!~}|{zy
                                                                                               xwvutsrqponmlk
                                                                                                  jihgfedcba`_^]
                                                                                     \[ZYXWVUTSRQPO
                                                                                               NMLKJIHGFEDCBA
                                                                                    @?>=<;:9y76543
                                                                210/(L,l*)(!E}
                   |B"!~}|{zyxwvu
                                                                                                     tsrqponmlkjiha
                                                                                                  fed]#a`_^]?zZY
                                                                                         XWVUTSRQ3ONMLK
                   JIHGFEDCBA:^>=
                                                                                                       <;:98705.R21q/
                                                                                               .-,+*#G'&%${"!
                                                                                            x>|{zyxwYutm3k
                                                                                                        ponmlkjihg`&^c
                                                                                     ba`_^]\[ZYXWVO
                   sSRQPONMLEi,HG
                                                                                                      FEDCBA@?>=6Z:9
                                                                                    y76543210/.-,+
                                                                                                          *)('&%$#"y?w|u
                   ;sxwvutm3qSonm
                                                                                                       fkjiha'edcba`_
                                                                                            ^]\[ZYXWVUTSRQ
                   PONM/EiIHGFEDC
                               BA@?>7[;:987w5
                                      432+O/o-,%I)('
                                     &}$#z@~}|{zsxw
                   vutsrqponmlkji
                                                                                                 ha'&dFba`_^]\U
                                                                                            yYXWVUTMRQPONM
                   LKDhH*F?DCBA@?
                                                                                                 8\<;:98765432r
                                                                                        0/.-&J*)('&f$#
                                                                                                       "!~}|{zyxwvuts
                                                                                                       rqj0nmOkjihaf_
                                                                                            %cE[!_^]\[=SwW
                                                                                                     VU7SLpPONMLEJI
                                                                                                          HAeEDC%A@?>=<;
                   :9876543210/.-
                                                                                                       ,+$H('&}${A!xw
                          ={]yxwvutsrk1o
                                                                                                 nmOejib(fedcE"
                                                                                                      `_^]?[ZYRvVUT6
                                                                                     RKo2HMLKJIHAe
                                                                                                           EDCBA@?>=<;:9
                    87w5432+O/.-,
                                                                                                 +*)('&%e#"y?w
                                                                                     |{zs9wvun4rqp
                                                                                                      onmlNjib(fedc
                                                                                           ba`_^]\[ZYXWV
                                                                                                   8TMqKPONMLKDh
                                                                                                      +GFEDCB;_?>=<
                                                                                                    ;:9y7654321*N
                    .-,+*)('&f|{A
                                                                                                       !~}|{]yxwvo5s
                                                                                             rqpinmlkjihg`
                                                                                            &dcbD`_^]\[Tx
                                                                        ;WVUTMRQJnN0F
                                                 KDhH*FEDC<A@?
     >=<5Y92765.R?

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

верификация

Чтобы проверить код Malbolge в этом онлайн-интерпретаторе , вставьте его в область кода Malbolge и нажмите Load/Reset, затем Execute.

Чтобы протестировать код 23 в этом онлайн-интерпретаторе , вставьте его в область « Источник» , нажмите, Enterчтобы вставить конечный перевод строки, введите 23в области « Консоль» (чтобы перейти от стандартной записи 23.dezsy к автоматическому определению) и нажмите Run Interpreter!.


20
Чувак ... похоже бомба взорвалась в твоем коде!
D.Tate

8
о_0 как ты написал код
Павел


55

Lua / C - 182 164 байта

#if 0
print"This program wasn't written in Lua, it was built for C!"--[[
#endif
main(){printf("This program wasn't written in C, it was built for Lua!\n");}/*]]--*/

Использует функцию, в которой Lua рассматривает хеш-метку в первой строке как комментарий, чтобы разрешить использование Unix-шебангов. В противном случае оборачивает комментарии другого языка в свои комментарии.

Чтобы сбрить байты, я полагаюсь на неявное поведение, которое выдает только предупреждения в GCC и Clang: неявное объявление int для основного и неявного определения printf.


3
Очень умно сделано!
Корова шарлатана

2
Если удаление «include <stdio.h>» является слишком экстремальным, я верну ответ.
Бенпоп

2
Почему бы не использовать //комментарий в части C? Сохраняет 2 байта.
BrainStone

54

JavaScript / Haskell, 158 байт 147 байт

Общая идея: проникнуть синтаксис каждого комментария в другой.

В одну строку:

u="This program wasn't written in ";v=", it was built for ";j="JavaScript";h="Haskell";{-console.log(u+j+v+h+"!")}//-}main=putStrLn$u++h++v++j++"!"

Как это выглядит для Хаскелла:

-- some variable definitions
u = "This program wasn't written in "
v = ", it was built for "
j = "JavaScript"
h = "Haskell"

-- a comment
{-console.log(u+j+v+h+"!")}//-}

-- the main method that does the dirty deed
main = putStrLn $ u ++ h ++ v ++ j ++ "!"

Как это выглядит для JavaScript:

/* variables can be declared without `var` */
u = "This program wasn't written in ";
v = ", it was built for ";
j = "JavaScript";
h = "Haskell";

/* hey look, an anonymous block! */
{ 
  /* we negate the `undefined` that comes out of console.log */
  -console.log(u+j+v+h+"!")
} 
/* there are two automatic semicolon insertions here:
   one before `}` and one before EOF. */

/* a one-line comment. */
//-}main=putStrLn$u++h++v++j++"!"

3
alertявляется игроком в гольф.
wizzwizz4

51

Brainfuck / Foo, 769 байт

-[--->+<]>-.[---->+++++<]>-.+.++++++++++.+[---->+<]>+++.[-->+++++++<]>.++.---.--------.+++++++++++.+++[->+++<]>++.++++++++++++.[->+++++<]>-.--[->++++<]>-.-[->+++<]>-.--[--->+<]>--.-----.[++>---<]>++.[->+++<]>-.[---->+<]>+++.--[->++++<]>-.-----.---------.+++++++++++..+++[->+++<]>.+++++++++.-[->+++++<]>-.-[--->++<]>-.+++++.-[->+++++<]>-.+[->++<]>.---[----->+<]>-.+++[->+++<]>++.++++++++.+++++.--------.-[--->+<]>--.+[->+++<]>+.++++++++.+++[----->++<]>.------------.-[--->++<]>-.+++++++++++.[---->+<]>+++.--[->++++<]>-.-[->+++<]>-.--[--->+<]>--.+[---->+<]>+++.[->+++<]>++.[--->+<]>-.------------.+++.++++++++.[---->+<]>+++.++[->+++<]>.+++++++++.+++.[-->+++++<]>+++.+++[->++<]>.+[--->+<]>++..[--->+<]>----."This program wasn't written in Foo, it was built for Brainfuck!"

Очень сложный и сложный ответ ... или нет.


21
Черт возьми, не ты снова Foo: D
Beta Decay

5
Мне нравится, как ты думаешь.
Пьер Арло

13
При запуске этого в Brainfuck, Brainfuck будет ждать ввода из- ,за текста в конце. Я считаю, что это противоречит правилам назначения.
Саймон Форсберг

1
@SimonForsberg, это долго, но в таком переводчике, как пробовать онлайн, и большинство других, я думаю, ,просто устанавливает ячейку в 0, для EOF
Destructible Lemon

41

C / Python, 238 символов

Это не печатает 100% точно, что запрашивается, но довольно близко.
Перезагрузка моей валентинки .

#define def main(){0?
#define print printf(
#define return 0)));}
#define pass 0);

def main():
    print "This program wasn't written in ",
    pass
    print "Python",
    print ", it was built for ",
    print "C",
    return

main();

5
Что это печатает, если это не точно?
Бета-распад

4
Эта вложенная принт вещь великолепна ...
immibis

4
Это недопустимо C. Clang жалуется на defи :после def main(), и вы фактически не открываете тело функции для main. Вы на самом деле пытались составить свой ответ в C?
C0deH4cker

5
Линия #define def main(){0?отсутствует
кей

3
#define returnзаставляет меня немного плакать ...
CorsiKa

32

С / С ++, 136

#include<stdio.h>
int main(){
char*a="++",z=sizeof'c'/2;
printf("This program wasn't written in C%s, it was built for C%s!\n",a+z,a+2-z);
}

Новые строки добавлены для форматирования. Попробуйте это на C или C ++ .


32
Что если я на платформе, где int составляет 2 байта? Где взять компилятор C +?
Имибис

@immibis haha: P, но если серьезно, пустой трюк со структурой может сработать:struct{}s;z=2*sizeof s
grc

31

Befunge / > <> , 141 138 134 133 130 байт

3 байта сохранены благодаря @Cole .

Если быть точным, я использую Befunge-98.

\"!><> rof tliub saw ti ,egnufeB"   >" rof nettirw t'nsaw margorp sih"'T>:#,_@'~~~~~~
>l?v"!egnufeB rof tliub saw ti ,><>"^
?!;>ol

Используя факты, которые:

  • \ это зеркало в> <> и своп в Befunge
  • 'string'это строка в> <> и 'cсимвол в Befunge

Если вам это не нужно для кода Befunge (что, я думаю, вам не нужно), вы можете сбрить 3 байта, заменив нижнюю строку на?!;>ol
cole

23

PHP / MySQL, 147 байт

-- $argc;die("This program wasn't written in PHP, it was built for MySQL!");
SELECT("This program wasn't written in MySQL, it was built for PHP!");

17
Наконец то, что я вроде понимаю.
MikeTheLiar

1
Вы должны быть в состоянии избавиться от скобок второй строки, на два байта меньше:SELECT"This program wasn't written in MySQL, it was built for PHP!";
msh210

2
Но это больше не будет работать в PHP - это вызовет ошибку разбора. SELECT "..." не является допустимым выражением PHP.
Разван

22

Python 3 / > <> , 177 173 172 167 байт

Спасибо @mathmandan за сокращение 5 байт!

Ну, это был опыт, и опыт тоже. Любые предложения по гольфу приветствуются, так как это довольно долго. Я старался изо всех сил повторно использовать текст, но это было довольно сложно.

Технически, это был бы Python 3, который должна выводить эта программа (и я мог бы изменить это, если бы я не соответствовал спецификациям - но в примере был показан вывод Python / C Python).

aa=" ni nettirw t'nsaw margorp sihT\"\""
v="><>!"                 #v   "><>"r~/
a=", it was built for "+v#\a
print(aa[-3::-1]+"Pytho" +"n"+a)
#  .4b;!?lor"!nohtyP r"~/

Попробуйте использовать онлайн> <> интерпретатор и Python 3 ( интерпретатор > <> требует, чтобы вы вводили код вручную)

Возвращает

This program wasn't written in ><>, it was built for Python!

в> <> и

This program wasn't written in Python, it was built for ><>!

в Python.

Объяснение (Python)

Для Python это довольно просто. Вот код, который нас интересует (в основном, код без комментариев, которые обозначены #в Python). Обратите внимание, что в Python \это escape-символ, когда он используется в строках, поэтому \"оценивается "в строке.

aa=" ni nettirw t'nsaw margorp sihT\"\""
v="><>!"
a=", it was built for "+v
print(aa[-3::-1]+"Pytho" +"n"+a)

Больше всего нас интересуют операции над переменной aa:

aa[-3::-1]: reverses the string and chops off the quotation marks (thanks to @mathmandan)

Таким образом, оператор print оценивает

"This program wasn't written in " + "Pytho" + "n" + ", it was built for ><>!"

Пояснение (> <>)

Теперь перейдем к более сложной части. Еще раз, вот код с удаленными ненужными битами.

aa=" ni nettirw t'nsaw margorp sihT\"\
                          v   "><>"r~/
a=", it was built for "+v \a

   .4b;!?lor"!nohtyP r"~/

Линия 1:

aa=" ni nettirw t'nsaw margorp sihT\"\

aa=         pushes 1 onto the stack (evaluates 10==10, basically)
" ni ... \" pushes the first part plus a \ onto the stack.
\           deflects the pointer downwards

Стек прямо сейчас (если напечатано): \This program wasn't written in

Строка 2:

Обратите внимание, что строка 2 начинается /с позиции указателя из строки 1 и перемещается справа налево.

v   "><>"r~/

/     deflects the pointer leftwards
~r    pops the / off the stack and then reverses it
"><>" pushes ><> onto the stack
v     deflects the pointer downwards

Стек прямо сейчас: ><> ni nettirw t'nsaw margorp sihT

Строка 3:

Как и предыдущая строка, эта начинается с \, где строка 2 отправляет указатель. Обратите внимание, что, поскольку указатель оборачивается вокруг строки, когда он достигает первой, aя напишу свое объяснение в порядке, в котором указатель идет (и, следовательно, что выполняется)

a=", it was built for "+v \a

\aa=       deflect and push 1 onto the stack
", i ... " push the string onto the stack
+v         sum the last two values pushed and deflect

Стек прямо сейчас ( xэто символ, образованный добавлением «r» и пробела. - это не фактический символ, а просто заполнитель от меня):

xof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT

Строка 4:

Указатель просто продолжается вниз, поэтому эта строка не требует дальнейшего объяснения.

Строка 5:

Начиная с /и идти влево.

.4b;!?lor"!nohtyP r"~/

~"r Python!" pops x off and adds back r and a space
r            reverses the stack
o            pops and prints a character
l?!;         pushes the length of the stack and stops if it's 0
b4.          pushes 11 then 4 then moves to that location (where o is)

Стек прямо сейчас (вывод обратный):

!nohtyP rof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT

И это должно быть для объяснения. Дайте мне знать, если есть какое-либо несоответствие между объяснением / кодом или я сделал что-то не так; Я еще немного поиграл в коде, пока писал пояснения, так что я мог бы смешать немного старого и нового кода.


Было бы неправильно, если бы я сказал, что вам нужно добавить 3, потому что это не Python 2. Это нормально.
Синий,

Если бы это был только Python, я думаю, вы могли бы заменить aa[:-2][::-1]на aa[-3::-1]. В этом случае, конечно, это может помешать форматированию> <>, но, возможно, стоит подумать, если вы этого еще не сделали. В частности, я почти уверен, что вам нужен пробел ниже vв предыдущей строке, но похоже, что print(aa[-3::-1]+"Pytho"он уместился бы в 24 символа ниже a=", it was built for "+, и тогда вы могли бы поставить пробел с последующим +"n"+a). Я не уверен, что это сломает что-то еще, но если это сработает, это сэкономит несколько байтов.
Матмандан

@mathmandan Отличная идея, я обновлю свой код и сообщу тебе.
Коул

Хорошая работа! FYI, я думаю , что это будет работать нормально в Python 2, и в Python 2 вы можете сохранить байты, понижая скобки в операторе печати: print aa[-3::-1]+"Pytho" +"n"+a. Еще один вопрос: в версии> <>, что происходит с тем, 1что изначально было помещено в стек?
Матмандан

@mathmandan Я думаю, что интерпретатор, который я использовал, не печатает символ, если он недействителен, или напечатанный символ вообще не отображается. Я честно не уверен на 100%, почему печать этого символа не имеет значения; Я обнаружил это случайно.
Коул

19

Пакетный файл .BAT / Пакетный файл .CMD, 194 185 байт

@ECHO OFF
SET a=BAT
SET b=CMD
CALL :F&&GOTO :C||GOTO :O
:C
SET a=CMD
SET b=BAT
:O
ECHO This program wasn't written for %a% File, it was built for %b% File!
GOTO :EOF
:F
md;2>nul
SET v=1

Редактировать: Сохранено 9 байт и исправлено пропущенное !благодаря DLosc

Да, есть различия между файлами BAT и CMD. Ссылка. По сути, CMD устанавливает команду ERRORLEVELon SET, в то время как BAT - нет, это означает, что здесь ERRORLEVELустановка с помощью неправильно сформированной mdкоманды очищается SET v=1в одной версии, а не в другой. Этот сценарий основан на примере, предоставленном "Ritchie" в этой теме группы новостей.

Обратите внимание, что сокращенный скрипт выше ENABLEEXTENSIONSдолжен быть установлен ON(он используется по умолчанию на каждой платформе). Расширенный сценарий ниже явно устанавливает его, чтобы гарантировать правильную работу. Без этого SETкоманда для CMD не разрешает все расширения, и (возможно, в некоторых системах) может установить их ERRORLEVELнеправильно.

Расширено и отмечено

@ECHO OFF
setlocal ENABLEEXTENSIONS

REM Call the :FUNC subroutine and branch based on the resulting errorlevel
CALL :FUNC&&GOTO :CMD||GOTO :BAT

REM Just in case. If we reach this, though, hoo-boy ...
GOTO :EOF

:BAT
REM We're a BAT file, so set variables and goto output
SET a=BAT
SET b=CMD
GOTO :OUTPUT

:CMD
REM We're a CMD file, so set variables and goto output
SET a=CMD
SET b=BAT
GOTO :OUTPUT

:OUTPUT
REM Print out the result, then go to end of file
ECHO This program wasn't written for %a% File, it was built for %b% File!
GOTO :EOF

:FUNC
REM Simple subroutine to set the ERRORLEVEL appropriately
md;2>nul
REM Right now, ERRORLEVEL on both CMD and BAT is 1
SET v=1
REM Right now, ERRORLEVEL on CMD is 0, but BAT is still 1

... есть разница между CMD и BAT?
Стэн Струм


16

CJam / GolfScript, 81 78 байт

"This program wasn't written in "o"GolfScript"", it was built for ""CJam"oo"!"

Оригинальная 81-байтовая версия:

"This program wasn't written in "["CJam"", it was built for ""GolfScript"]-1a%"!"

14

PHP / Perl, 98 96 байт

$a="HP";$b="erl";
//;$a=$b;$b=HP;
print"This code wasn't written in P$a, it was built for P$b!";

Не знаю, обманывает это или нет, поскольку, насколько я могу судить, единственный способ запустить PHP без открывающего <?тега - это что-то вроде php -r $(cat codefile.php). Но если предположить, что это законно ... //это комментарий PHP, но в Perl это регулярное выражение (которое само по себе не делает ничего). Остальное должно быть довольно понятным.

Редактировать: теперь используя голое слово в части только для Perl. Я хотел использовать их в первую очередь для обоих языков, но PHP делает предупреждение, когда вы делаете это, в отличие от «Не должно быть вывода в stderr».


1
<?'>#';допустимый синтаксис на обоих языках.
прима

14

Рубин / Питон, 105 символов

a=["Ruby","Python"];a.sort();print("This program wasn't written in "+a[0]+", it was built for "+a[1]+"!")

Это действительно хорошо! Особенно мне нравится, что здесь нет комментариев.
Styfle

14

JavaScript 1,8 / JavaScript 1,7, 89 байт

a=![].reduce;`This program wasn't written in JS 1.${8-a}, it was built for JS 1.${7+a}!`

Потому что 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 ударил еще один байт, предлагающий отменить булеву проверку


С "JS" вместо "JavaScript", используя дважды "JS 1." в вашей строке короче, чем с помощью переменной b.
Хэди,

Вы можете использовать строку шаблона, чтобы сделать ее короче: `Эта программа не была написана на JS 1. $ {7 + a}, она была построена для JS 1. $ {8 + a}!`
Hedi

2
Я думаю, что вы можете сохранить два байта, изменив a=[].reduce?1:0;на a=!![].reduce;.
ETHproductions

@ETHproductions Спасибо, но я не думаю, что это сработает. Мне нужно aдержать значение 1или 0нет, trueилиfalse
Марио Трукко

@ETHproductions извините, вы правы, я пытался, и это работает. Спасибо!
Марио Трукко

13

SWI-Пролог 6 / SWI-Пролог 7, 156 байт

P='SWI-Prolog ',A=6,B=7,(is_list(""),N=A,M=B;N=B,M=A),atomic_list_concat(['This program wasn\'t written in ',P,N,', it was built for ',P,M,'!'],W),write(W).

Использует тот факт, что двойные кавычки ""являются строковыми кодами (т. Е. Списком кодов символов) в версиях SWI-Prolog старше 7 и являются правильным типом String в версии 7. is_list("")Таким образом, в версии 7 будет false, а в более ранних версиях - true.


12

BF / SPL, 5342 байта

Я почти уверен, что это первый полиглот Шекспира на языке программирования на этом сайте.

Вероятно, не собираюсь выигрывать какие-либо призы. Работает, вставляя код BF в заголовки актов / сцен / программ. Код SPL использует восклицательные знаки вместо точек, за исключением нескольких случаев. Программы не должны принимать входные данные, поэтому запятые в объявлениях символов «закомментированы» путем обнуления ячеек и заключения в квадратные скобки вокруг запятых. Та же процедура применяется, когда прячешь квадратные скобки вокруг операторов ввода / вывода.

[-][.
Ford,.
Page,.
Act I:]+++++++++[>+++++++++<-]>+++.
Scene I:>[.
[Enter Ford and Page]
Ford:
You is sum of bad bad bad bad bad bad day and sum of bad bad bad bad day and bad bad day!Speak thy mind!
Scene II:]<<++[>++++++++++<-]>.
Page:
You is sum of bad bad bad bad bad bad day and sum of bad bad bad bad bad day and bad bad bad day!Speak thy mind!
Scene III:+.
Page:
You is sum of thyself and day!Speak thy mind!
Scene IV:++++++++++.
Page:
You is sum of thyself and sum of bad bad bad day and bad day!Speak thy mind!
Scene V:>++++[>++++++++<-]>.
Ford:
You is fat fat fat fat fat cat!Speak thy mind!
Scene VI:[-<+>]<<---.
Page:
You is sum of thyself and sum of big pig and pig!Speak thy mind!
Scene VII:++.
Page:
You is sum of thyself and fat cat!Speak thy mind!
Scene VIII:---.
Page:
You is sum of thyself and sum of big pig and pig!Speak thy mind!
Scene IX:--------.
Page:
You is sum of thyself and big big big pig!Speak thy mind!
Scene X:+++++++++++.
Page:
You is sum of thyself and sum of fat fat fat cat and sum of fat cat and cat!Speak thy mind!
Scene XI:<++++[->----<]>-.
Page:
You is sum of thyself and sum of big big big big pig and pig!Speak thy mind!
Scene XII:++++++++++++.
Page:
You is sum of thyself and sum of fat fat fat fat cat and big big pig!Speak thy mind!
Scene XIII:>.
Ford:
Speak thy mind!
Scene XIV:<++++++++++.
Page:
You is sum of thyself and sum of fat fat fat cat and fat cat!Speak thy mind!
Scene XV:<++++[->-----<]>--.
Page:
You is sum of thyself and sum of big big big big big pig and sum of fat fat fat cat and fat cat!Speak thy mind!
Scene XVI:<++++[>++++<-]>++.
Page:
You is sum of thyself and sum of fat fat fat fat cat and fat cat!Speak thy mind!
Scene XVII:-----.
Page:
You is sum of thyself and sum of big big pig and pig!Speak thy mind!
Scene XVIII:>+++++++.
Ford:
You is sum of thyself and sum of fat fat fat cat and pig!Speak thy mind!
Scene XIX:<++++++.
Page:
You is sum of thyself and sum of fat fat cat and fat cat!Speak thy mind!
Scene XX:>-------.
Ford:
You is sum of thyself and sum of big big big pig and cat!Speak thy mind!
Scene XXI:<+++.
Page:
You is sum of thyself and sum of fat cat and cat!Speak thy mind!
Scene XXII:-----.
Page:
You is sum of thyself and sum of big big pig and pig!Speak thy mind!
Scene XXIII:---------.
Page:
You is sum of thyself and sum of big big big pig and pig!Speak thy mind!
Scene XXIV:+++++++++++.
Page:
You is sum of thyself and sum of cat and sum of fat cat and fat fat fat cat.Speak thy mind!Speak thy mind!
Scene XXV:<+++[>-----<-]>.
Page:
You is sum of thyself and sum of big big big big pig and cat!Speak thy mind!
Scene XXVI:+++++++++.
Page:
You is sum of thyself and sum of fat fat fat cat and cat!Speak thy mind!
Scene XXVII:>.
Ford:
Speak thy mind!
Scene XXVIII:<-----.
Page:
You is sum of thyself and sum of big big pig and pig!Speak thy mind!
Scene XXIX:+++++.
Page:
You is sum of thyself and sum of fat fat cat and cat!Speak thy mind!
Scene XXX:>.
Ford:
Speak thy mind!
Scene XXXI:[->++<]>++.
Page:
You is sum of thyself and sum of big big big big big pig and sum of fat fat cat and cat!Speak thy mind!You is sum of thyself and sum of big pig and pig!Speak thy mind!
Scene XXXII:++++.
Page:
You is sum of thyself and big red hog!Speak thy mind!
Scene XXXIII:<+++++[>-----<-]>-.
Page:
You is sum of thyself and big big big big big pig!Speak thy mind!
Scene XXXIV:[-<+>]<------------.
Ford:
Speak thy mind!
Scene XXXV:<-----.
Page:
You is sum of thyself and sum of fat fat fat fat fat fat cat and sum of big pig and pig!Speak thy mind!
Scene XXXVI:+++++++++++.
Page:
You is sum of thyself and sum of fat fat fat cat and sum of fat cat and cat!Speak thy mind!
Scene XXXVII:>.
Ford:
Speak thy mind!
Scene XXXVIII:<+++.
Page:
You is sum of thyself and sum of fat cat and cat!Speak thy mind!
Scene XXXIX:<++++[->-----<]>--.
Page:
You is sum of thyself and sum of big big big big big pig and sum of fat fat fat cat and fat cat!Speak thy mind!
Scene XL:<++++[>++++<-]>++.
Page:
You is sum of thyself and sum of fat fat fat fat cat and fat cat!Speak thy mind!
Scene XLI:>.
Ford:
Speak thy mind!
Scene XLII:<<++++[>----<-]>-.
Page:
You is sum of thyself and sum of big big big big pig and pig!Speak thy mind!
Scene XLIII:<+++++[>++++<-]>-.
Page:
You is sum of thyself and sum of fat fat fat fat cat and sum of fat cat and cat!Speak thy mind!
Scene XLIV:------------.
Page:
You is sum of thyself and sum of big big big big pig and fat fat cat!Speak thy mind!
Scene XLV:+++.
Page:
You is sum of thyself and sum of fat cat and cat!Speak thy mind!
Scene XLVI:++++++++.
Page:
You is sum of thyself and fat fat fat cat!Speak thy mind!
Scene XLVII:>.
Ford:
Speak thy mind!
Scene XLVIII:<--------------.
Page:
You is sum of thyself and sum of big big big big pig and fat cat!Speak thy mind!
Scene XLIX:+++++++++.
Page:
You is sum of thyself and sum of fat fat fat cat and cat!Speak thy mind!
Scene L:+++.
Page:
You is sum of thyself and sum of fat cat and cat!Speak thy mind!
Scene LI:>.
Ford:
Speak thy mind!
Scene LII:>+++++++[<+++++++>-]<++.
Page:
You is sum of thyself and sum of big big big big big pig and big big big big pig!Speak thy mind!
Scene LIII:---.
Page:
You is sum of thyself and fat fat cat!Speak thy mind!
Scene LIV:----.
Ford:
You is sum of thyself and cat!Speak thy mind!
Scene LV:>+++++++[<------>-]<-.
Ford:
You is cat!
Scene LVI:>[.
[Exeunt]

Проверьте BF на https://repl.it/E8Hh/23 .

Код SPL был протестирован на компиляторе, найденном здесь: https://github.com/drsam94/Spl/ .


11

Рубин 1,8 / Руби 1,9, 87

puts"This program wasn't written in Ruby 1.#{?9%49}, it was built for Ruby 1.#{?8%47}!"

В Ruby 1.8 ?9это значение ASCII «9», которое равно 8 по модулю 49. В Ruby 1.9 это строка «9», и %49это операция форматирования, которая ничего не делает, поскольку «9» не имеет строк формата в Это.


11

Python 2.7.9 / Python 2.7.10, 127 байт

У нас было несколько постов, в которых использовались второстепенные версии, но ни одна из них не перешла на следующий уровень ...

import types
n=len(dir(types))
print"This program wasn't written in Python 2.7.%d, it was made for Python 2.7.%d!"%(n%33,-n%52)

Попробуйте это на Ideone (Python 2.7.10) и repl.it (технически Python 2.7.2, но должен дать тот же результат, что и 2.7.9).

Python 2.7.10, согласно журналу изменений :

Добавлен __all__в typesмодуль.

Это подтолкнуло len(dir(types))от 42 до 43, давая числовую разницу, которую мы можем использовать для получения желаемого результата.


10

Python / QBasic, 160 142 байта

Протестировано с Python 3 и QBasic 1.1 . Не будет работать в Python 2 без добавления from __future__ import print_functionв строку 4.

1# DEFSTR A-B
a = "QBasic"
b = "Python"
'';a,b=b,a;PRINT=print
PRINT ("This program wasn't written in " + a + ", it was built for " + b + "!")
  • В Python 1#это выражение 1(no-op), за которым следует комментарий. В QBasic это номер строки (с суффиксом типа, помечающим его как DOUBLE). DEFSTRУтверждение говорит QBasic , что все переменные, имена которых начинаются с Aили B(без учета регистра) являются строковыми переменными. Таким образом, мы можем вызывать наши переменные aи bвместо a$и b$(что не будет работать в Python).
  • В QBasic 'начинается комментарий. В Python ''это пустая строка (no-op). Затем мы меняем имена языков и определяем псевдоним для printфункции (поскольку ключевые слова QBasic автоматически форматируются в верхний регистр).
  • Скобки в последней строке не обязательны в QBasic, но и ничего не повредят.

Если мне разрешено отключить автоформатор (который является опцией в QB64 , но не в оригинальном QBasic), я могу уменьшить его до 114 байт с помощью Python 2 :

1#DEFSTR A-B
a="QBasic"
b="Python"
'';a,b=b,a
print"This program wasn't written in "+a+", it was built for "+b+"!"

-3 байта: переключиться на фактический QB64.
CalculatorFeline

Автоформатирование.
CalculatorFeline

QB64 / Python 2 составляет 131 байт! Или Python 3 для 133 байтов.
CalculatorFeline

9

Perl / Ruby, 129 байт

0&&eval('def sort a,b;[b,a] end');printf"This program wasn't written in %s, it was built for %s!",(@a=sort"Perl","Ruby")[0],@a[1]

В этом нет никакого злоупотребления регулярным выражением, просто используется тот факт, что 0 является правдоподобным в Ruby для evalопределения sort(которое на самом деле reverses) и printfing. Руби не нравилось использовать список аргументов, поэтому мне приходилось делать каждый из них в отдельности.


Почему aдолжна быть переменная экземпляра, а не локальная?
Ник Хартли,

@QPaysTaxes @Сигил для переменной в Perl означает, что это список, в Perl хранение, скажем, $aвместо этого, не приводит к выводу.
Дом Гастингс,

Ах я вижу. Спасибо за объяснение.
Ник Хартли

9

/// и Retina , 95 + 3 = 98 байт

/
//

This program wasn't written in \/\/\/, it was built for Retina!
/?./....(.*)(R.*)!
$2$1///!

+3 байта за -sфлаг в сетчатке.

Объяснение для ///

Первая инструкция

/
//

удаляет все новые строки из остальной части кода, в результате чего

This program wasn't written in \/\/\/, it was built for Retina!/?./....(.*)(R.*)!$2$1///!

Все вплоть до !буквального и напечатано в STDOUT. Следующая инструкция

/?./....(.*)(R.*)!$2$1/

Но строка поиска ?.не может быть найдена, поэтому ничего не происходит. Тогда оставшийся код //!является неполной инструкцией, поэтому программа завершается, напечатав правильную строку.

Объяснение для сетчатки

/
//

Это говорит Retina для замены /на //. Но вход пуст, так что ничего не совпадает.

<empty>
This program wasn't written in \/\/\/, it was built for Retina!

Это заменяет ввод строкой во второй строке.

/?./....(.*)(R.*)!
$2$1///!

Это соответствует строке \/\/\/, it was built for Retina!и заменяет ее, Retina, it was built for ///!чтобы дать правильный результат.


Вы знаете, я думаю, что было бы тривиально сделать один между Retina и rs ...;)
kirbyfan64sos

@ kirbyfan64sos Возможно, но насколько коротким это будет? ;)
Мартин Эндер

Ну, до сих пор я получил около 85 байт + 3 -s, хотя, сказав, что я сделал, испортило веселье! : D
kirbyfan64sos

1
@ kirbyfan64sos Идите и опубликуйте это, я не думаю, что у меня будет время, чтобы посмотреть rs в ближайшее время.
Мартин Эндер

9

sed / Hexagony 251 Bytes

/$/cThis program wasn't written in sed, it was built for Hexagony!
#...>32;p;r;o;g;r;\+/;a;w;23+;m;a<.;.>s;n;+39;t;+32\s/;n;e;;t;i;r;w;<. |.>+32;i;n;+32;H;e\ ;/4+;y;n;o;g;a;x;< i>4;+32;i;t;+32;\;/u;b;23+;s;a;w<h>;i;l;t;+32;f\;/;s;23+;r;o;< T>e;d;+33;@

sed: попробуйте онлайн!
Гексагония: Попробуйте онлайн!


В sed он печатает правильную строку, если совпадает с пустой строкой в ​​конце (всегда). Вторая строка - это комментарий. Для этого требуется строка в STDIN, но она может быть пустой ( допускается на основе этого консенсуса ).

Пример:

echo '' | sed -f whatLanguage.sed

В Hexagony, первый /перенаправляет в нижний левый угол, он следует за левой стороной до того места, где начинается sed, затем просто переносится слева направо, вниз по линии, справа налево, вниз по линии и так далее. Расширенный гекс выглядит так:

         / $ / c T h i s p r 
        o g r a m w a s n ' t 
       w r i t t e n i n s e d 
      , i t w a s b u i l t f o 
     r H e x a g o n y ! # . . . 
    > 3 2 ; p ; r ; o ; g ; r ; \
   + / ; a ; w ; 2 3 + ; m ; a < .
  ; . > s ; n ; + 3 9 ; t ; + 3 2 \
 s / ; n ; e ; ; t ; i ; r ; w ; < . 
| . > + 3 2 ; i ; n ; + 3 2 ; H ; e \ 
 ; / 4 + ; y ; n ; o ; g ; a ; x ; < 
  i > 4 ; + 3 2 ; i ; t ; + 3 2 ; \
   ; / u ; b ; 2 3 + ; s ; a ; w <
    h > ; i ; l ; t ; + 3 2 ; f \
     ; / ; s ; 2 3 + ; r ; o ; < 
      T > e ; d ; @ . . . . . .
       . . . . . . . . . . . .
        . . . . . . . . . . .
         . . . . . . . . . .

Я никогда не пойму гексагонию ...
DJgamer98

@ DJgamer98 Я тоже не совсем понимаю. Я впервые использую его.
Райли

Вы можете немного сократить Hexagony, используя тот факт, что ;для определения значения байта используется текущий мод ячейки 256 (например, вы можете напечатать пробел P0;независимо от текущего значения ячейки). Этот сценарий CJam генерирует все пары: cjam.tryitonline.net/…
Мартин Эндер,

9

Python / Retina, 133 120 119 117 115 байт

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

#?.*
print"This program wasn't written in Python, it was built for Retina!"
#?.*t"

#?(\w+)(,.* )(.+)!"
#$3$2$1!
#

Python просто печатает заявление. Retina заменяет что-либо с помощью оператора печати Python, затем удаляет printи все кавычки. Затем я поменять Pythonи Retinaи удалить #.

Попробуй в Python | Попробуй в Retina



@ jimmy23013 Пределы не существовали на момент публикации этого вызова. Это относительно новая функция Retina.
mbomb007


8

JavaScript / CoffeeScript, 125 124 байта

console.log("This program wasn't written in",(a=['Coffee','Java'])[+(b=0=='0')]+"Script, it was built for",a[b^1]+"Script!")

В CoffeeScript a==bкомпилируется до a===b, что делает промежуточное условие ложным. Я использовал немного магии, чтобы преобразовать логическое значение в целое число.

Сохранено 1 байт благодаря @DomHastings!

125-байтовая версия:

console.log("This program wasn't written in",(a=['Coffee','Java'])[(b=0=='0')+0]+"Script, it was built for",a[b^1]+"Script!")

Приятно! Я думаю, что вы можете сохранить байт +(b=0=='0')вместо +0!
Дом Гастингс

Вместо b^1, я думаю, вы можете использовать~b
Исмаэль Мигель

@IsmaelMiguel Нету. Это говорит, что это было построено для undefinedScript.
kirbyfan64sos

Я забыл это ~1 == -2. Но (b=0=='0')+0можно записать как +(b=0=='0'). Или b=+(0=='0'). Это должно отрезать 1 байт.
Исмаэль Мигель

@IsmaelMiguel Я уже делал это в самой последней версии ...
kirbyfan64sos
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.