Полихин - это как квин, так и полиглот. 1 Вы должны написать квинну, которая действительна как минимум на двух разных языках. Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
1 Я сделал это. Или, скорее, Geobits сделал . Видимо, он тоже не был первым .
Правила для Quines
Принимаются только настоящие квины. То есть вам нужно вывести весь исходный код дословно в STDOUT без :
- чтение вашего исходного кода, прямо или косвенно.
- полагаясь на среду REPL, которая просто оценивает и печатает каждое выражение, которое вы передаете.
- полагаться на языковые функции, которые в некоторых случаях просто распечатывают источник.
- используя сообщения об ошибках или STDERR, чтобы написать полностью или частично quine. (Вы можете писать что-то в STDERR или выдавать предупреждения / несмертельные ошибки, если STDOUT является действительным кванем, а сообщения об ошибках не являются его частью.)
Кроме того, ваш код должен содержать строковый литерал.
Правила для полиглотов
Используемые два языка должны быть совершенно разными. Особенно:
- Они не должны быть разными версиями одного и того же языка (например, Python 2 против Python 3).
- Они не должны быть разными диалектами одного и того же языка (например, Паскаль против Дельфи).
- Один язык не может быть подмножеством другого (например, C против C ++).
Ответы:
CJam / GolfScript, 34 байта
Счетчик байтов содержит завершающий перевод строки, так как без него программа не была бы quine.
Хотя CJam и GolfScript очень похожи в некоторых аспектах, есть много различий. Чтобы сделать этот «честный» полихин, я решил как можно больше полагаться на различия . За исключением блочного и строкового синтаксиса (который разделяют языки с очень многими другими), ни одна часть кода не достигает абсолютно одинакового в обоих языках.
У онлайн-интерпретатора GolfScript есть ошибка; Эта программа работает только с официальным переводчиком.
Пример запуска
Как это работает (CJam)
Как это работает (GolfScript)
CJam / GolfScript, 12 байт
Обманчивое решение, которое максимально избегает языковых различий.
Попробуйте онлайн:
Как это работает (CJam)
Как это работает (GolfScript)
источник
C # / Java, 746 байт
Я использую свойство, что символы в Java могут быть записаны как идентичные последовательности Юникода. Если у нас есть
A
инструкция для компилятора C # иB
инструкция для Java, мы можем использовать следующий фрагмент кода:Это будет "распознано" следующим образом с C #:
И следующим образом по Java:
Потому что
\u000A
это разрыв строки,\u002F
есть/
и\u002A
есть*
в Java.Итак, последний полиглот-квин:
Однако размер слишком велик из-за многословия языков.
Компиляция доступна на ideone.com: C # , Java .
источник
Python 3 и JavaScript, 134 байта
Вот моя (последняя?) Попытка:
Вероятно, это может быть немного больше, особенно если кто-нибудь знает лучший способ получить одинарные кавычки в JavaScript.
Сложившаяся программа выглядит так:
eval()
Функция будет вычислять выражения на обоих языках. Таким образом, выполняется длинная строка:Это разбивает длинную строку на пробелы и оценивает подстроку, проиндексированную
2%-4
. JavaScript будет запускать третью substring (2 % -4 == 2
), а Python - last last (2 % -4 == -2
), потому что их операторы по модулю ведут себя по-разному для негативов.Остальная часть строки игнорируется на обоих языках. JavaScript останавливается на
//
, а Python видит его как целочисленное деление и останавливается на#
.Таким образом, JavaScript выводит исходный код на консоль здесь:
И Python здесь:
Оба используют последнюю часть строки, которая является шаблоном программы:
источник
a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"])
. Протестировано в JavaScript, но не в python ... но это должно работать.a.split(1)
.q=unescape("%27")
Ruby / Perl / PHP, 52
Скопировано дословно из Perl quine Кристофера Дурра .
Это правила злоупотребления. Ruby и Perl определенно не являются тем же языком, и при этом Perl не является подмножеством Ruby (например, большинство связанных Perl-квин не работают в Ruby). Но Ruby был разработан, чтобы иметь возможность выглядеть очень похожим на Perl, если вы этого хотите, и это часто случается при игре в гольф.
источник
-R
и вам не нужны теги сценария. php.net/manual/en/features.commandline.options.phpBash / GolfScript, 73
На каждой из первых трех строк есть пробел.
Bash / GolfScript, 78
источник
PHP / Perl - 171
Бежать с:
php
Код на самом деле работает (не только самая печать).источник
Баш / Рубин,
10482Старая версия:
Bash / Ruby, 128 без неопределенного поведения
источник
<<a
в Ruby работает так же, как Bash, но возвращает строку. Я не писал программу на Ruby раньше. Я только что нашел случайный язык с этой функцией.<<word
возвращает строку, закрытую строкой с однимword
.reticular / befunge-98, 28 байт [неконкурентный]
Попробуйте ретикулярно! Попробуйте befunge 98!
Все, что находится между
;
s в befunge, игнорируется и!
пропускается в сегмент между;
s для ретикулярной записи. Таким образом, сетчатка видит:Befunge видит:
источник
Ruby / Mathematica, 225 байтов
Вот моя собственная многообещающая полихина (которая служит примером и проверкой концепции):
Первая часть основана на этой рубиновой квине и в основном:
Назначение строк в Mathematica точно такое же.
puts s%s
Интерпретируются как произведение 4 символов:puts
строкаs
,%
(последний результат REPL или ,Out[0]
если это первое выражение вы оцениваете) и другойs
. Это, конечно, совершенно бессмысленно, но Mathematica не заботится и;
подавляет любой вывод, так что это просто обрабатывается без вывода сообщений. Затем#
делает оставшуюся часть комментария для Ruby, а Mathematica продолжается.Что касается кода Mathematica, то большая его часть состоит в том, чтобы моделировать обработку строк в формате Ruby без использования строковых литералов.
FromCharacterCode@{37,112}
есть%p
иFromCharacterCode@{37,112}
есть%%
. Первый заменяется самой строкой, (гдеInputForm
добавляются кавычки), второй - одиночным%
. РезультатPrint
ред. Последний улов - как бороться с этим#
на фронте. Это символ Mathematica для первого аргумента чистой (анонимной) функции. Итак , что мы делаем, мы сделать все , что в чистой функции путем добавления&
и немедленно вызвать функцию с аргументом1
. Предшествующий1
к вызову функции «умножает» результат на1
, который Mathematica снова просто проглатывает, независимо от того, какую вещь возвращает функция.источник
> <> и CJam, 165 байт
Для CJam программа начинается с многострочного строкового литерала. Это экранируется
`
, и затем он использует стандартный quine для печати кода quine, а также завершающий комментарий.To> <>, первый
"
запускает строковый литерал, который проходит всю первую строку, помещая каждый символ в стек. После этого завершающие пробелы (созданные из-за дополняемого ввода) удаляются, а затем стек переворачивается. Каждый символ в стеке (т. Е. Весь первый ряд) выводится, а затем он перемещается вниз во второй ряд.Второй ряд, по сути, делает то же самое, за исключением того, что он в противоположном направлении, поэтому вам не нужно переворачивать стек. (Я делаю в любом случае, потому что я должен удалить завершающие пробелы.)
Наконец, он переходит на третью строку. Единственное существенное отличие состоит в том, что вы должны пропустить блок CJam, что делается с помощью
.
одинарной кавычки, которая захватывает всю строку (снова, в обратном направлении), а затем выводится.источник
C / PHP,
266304300282241203 + 10 байт+10 байт, потому что для компиляции в C требуется флаг компилятора GCC
-Dfunction=
.Как это работает (в PHP):
<?php
HTML.//
это не комментарий в HTML, поэтому он просто печатается.main
объявлен как функция с переменнойa
.printf
печатает возврат каретки (чтобы переопределить уже напечатанный//
), а затем исходный код, используя стандартный метод цитирования C / PHP.#if 0
игнорируется PHP.main($a)
инициализирует пустую переменнуюa
. (Ранее использовалсяerror_reporting(0)
для игнорирования ошибок, вызванных вызовомmain()
)#endif
также игнорируется PHP.Как это работает (в C):
//<?php
это однострочный комментарий, поэтому он игнорируется.function
Ключевое слово игнорируется в связи с компилятором аргумента командной строки-Dfunction=
.$
. (Это спасло день.)printf
печатает возврат каретки (бесполезный в данном случае), а затем исходный код, используя стандартный метод цитирования C / PHP.#if 0
игнорирует все до тех порendif
, пока не сможет вызвать PHPmain
.#endif
заканчивает блок "игнорируй меня"источник
Wumpus / > <> / Befunge-98 28 байт
Попробуйте это в Wumpus! , Попробуйте в> <>! , Попробуйте в Befunge-98!
Как это работает:
Код Wumpus:
> <> Код:
Код Befunge-98:
источник
05AB1E / 2sable, 14 байтов, неконкурентный
Попробуйте онлайн! (05AB1E)
Попробуйте онлайн! (2sable)
2sable является производным от 05AB1E и аналогичен, но имеет существенные отличия.
Завершающий перевод строки.
источник
C / TCL, 337 байт
источник
C / Vim 4.0, 1636 байт
Содержит управляющие символы.
Ваш Vim должен иметь следующий набор:
источник
C / Lisp, 555 байт
Преднамеренно пустая первая строка.
источник
Perl / Javascript (SpiderMonkey), 106 байт
Попробуйте Perl онлайн!
Попробуйте JavaScript онлайн!
объяснение
Данные Quine хранятся на
$_
обоих языках и затемeval
редактируются, что является довольно стандартной процедурой в Perl. Я выбрал SpiderMonkey на TIO, так как он имеетprint
функцию, но ее можно легко перенести в браузер на + 20 байт (добавьтеeval("print=alert");
в начало$_
определения s).Perl видит данные, хранящиеся в них,
$_
и видитeval
их как обычно. Так как+[]
это правда в Perl,'
хранится в$q
через stringwise-XORh
иO
. Последний трюк заключается в вызове того,print
где используется первая часть JavaScript+
, которая в Perl обрабатывает все элементы как числа и складывает их0
, затем мы используем||
оператор, чтобы вернуть то, что мы на самом деле хотим,(q($_),"=$q$_$q;",q(eval($_)))
что эквивалентно"\$_=$q$_$q;eval(\$_)"
.В JavaScript,
+[]
возвращается0
, поэтому мы называемunescape("%27")
хранить'
в$q
(к сожалению,atob
doesm't , присутствуют в SpirderMonkey ...). В вызовеprint
, поскольку+
в JavaScript есть оператор конкатенации, первый блок создает желаемый вывод, а вторая часть после||
него игнорируется.Спасибо комментарию Патрика Робертса за
unescape
трюк!Perl / JavaScript (браузер), 108 байт
Попробуйте Perl онлайн!
объяснение
Мы храним данные quine
$_
на обоих языках, а затемeval
их, что является довольно стандартной процедурой в Perl.Perl видит данные, хранящиеся в них,
$_
и видитeval
их как обычно.eval
Внутри$_
выполнен и не в разбор, но так как этоeval
, не ошибка.printf
Затем вызывается с единственной строкой в кавычкахq()
,`
в качестве разделителя, так как простое использование`
приведет к выполнению команд в оболочке, а затем при первом использовании$q
, поскольку+[]
это правда в Perl,'
сохраняется в$q
через stringwise-XOR ofh
иO
.В JavaScript
eval
блок внутри$_
устанавливает функциюq
, которая имеетreturn
свой аргумент как aString
и псевдонимconsole.log
дляprintf
, так какconsole.log
форматирует строку какprintf
в Perl. Когдаprintf
вызывается,+[]
возвращается0
, поэтому мы вызываемatob
для декодирования'
и сохранения в$q
.источник
Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 байт
Проверьте это онлайн!
Основываясь на моих обновлениях к этому ответу , я решил попробовать оптимизировать код, который печатает другую перестановку, но в итоге добавил Bash, который в любом случае добавил больше байтов. Хотя это более оптимизировано, чем моя первая попытка (сэкономлено более 300 байт), я уверен, что он все еще может быть использован в дальнейшем.
Альтернативный Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 байт
Проверьте это онлайн!
Немного ближе к моему первоначальному подходу, но повторение аргументов за
printf
все еще безумно. Используя позиционные аргументы , вместо того, чтобы сделать эту работу только в Chrome и сложно заставить работать в PHP , а также потому , что$s
в%1$s
интерполирован, но может сэкономить много байт, возможно , используя комбинацию этих двух подходов ...источник
C / dc, 152 байта
Воспользовавшись комментариями, да!
источник
Perl 5 / Ruby / PHP / JavaScript (браузер), 153 байта
Попробуйте Perl онлайн!
Попробуйте Ruby онлайн!
Попробуйте PHP онлайн!
источник