Предположим, у вас есть 2 языка, A
и B
. Строка s
является полухинией, A
и B
если она удовлетворяет следующим условиям:
s
это квин на языкеA
.s
полиглот вA
аB
.- Результатом работы
s
в качествеB
программы является другая строкаs'
, которая представляет собой квинусB
.
Цель этой задачи состоит в том, чтобы написать полуколину на двух разных языках. Это код-гольф , поэтому выигрывает самый короткий код, причем самый ранний ответ используется в качестве тай-брейка.
Правила для Quines
Принимаются только настоящие квины. То есть вам нужно вывести весь исходный код дословно в STDOUT без :
- чтение вашего исходного кода, прямо или косвенно.
- полагаясь на среду REPL, которая просто оценивает и печатает каждое выражение, которое вы передаете.
- полагаться на языковые функции, которые в некоторых случаях просто распечатывают источник.
- используя сообщения об ошибках или STDERR, чтобы написать полностью или частично quine. (Вы можете писать что-то в STDERR или выдавать предупреждения / несмертельные ошибки, если STDOUT является действительным кванем, а сообщения об ошибках не являются его частью.)
Кроме того, ваш исходный код не должен состоять исключительно из литералов (будь то строковые литералы, числовые литералы и т. Д.) И / или NOP. Например, `12
это полиглот в Jelly и Pyth, но в Jelly это NOP и числовой литерал, поэтому он недопустим.
Любой не подавляемый вывод (например, уведомления об авторских правах, сообщения о запуске / завершении работы или задний перевод строки) может быть проигнорирован в выводе ради действительности квин.
Правила для полиглотов
Используемые два языка должны быть совершенно разными. В частности:
- Они не должны быть разными версиями одного и того же языка (например, Python 2 против Python 3).
- Они не должны быть разными диалектами одного и того же языка (например, Паскаль против Дельфи).
- Один язык не может быть подмножеством другого (например, C против C ++ 1 ).
- Один язык не может быть тривиальной производной другого (например, Matlab против Octave 2 , брейнфук против boolfuck против TinyBF против ShadyAsFuck против всех других тривиальных производных мозга).
Разные правила
- Вы не можете принимать входные данные от STDIN (или любого другого источника). Если выбранный вами язык должен принимать входные данные, то либо вход должен быть пустым (пустая строка, по трубопроводу
/dev/null
и т. Д.), Либо вывод программы не должен зависеть от ввода. - Для этого испытания вы должны написать полную программу. Запрещается запрашивать дополнительный код для запуска решения (например, присваивать и вызывать лямбда-функцию, определенную в решении).
1: Да, я знаю, что C на самом деле не является подмножеством C ++. Это достаточно близко, чтобы считаться одним для полиглотов, поэтому я считаю это для этой задачи.
2: Как и в пункте 1 выше, хотя Octave технически не на 100% совместим с Matlab, он был разработан для совместимости и достаточно близок, чтобы использование полиглота Matlab / Octave могло бы упростить задачу.
Ответы:
GolfScript + Fission ,
1918 байтКонечный перевод строки необходим.
Это настоящий quine в GolfScript. Попробуйте онлайн!
В Fission это печатает
который является истинным Quine в делении . Попробуйте онлайн!
объяснение
В GolfScript все что угодно
является quine до тех пор, пока
...
оставляет строку".~"
в стеке..
Дублирует блок, таким образом, что есть одна копия , которая печатается в конце концов, и~
выполняет его, поэтому мы можем использовать его содержимое для печати.~
себя. В этом случае блок выталкивает строкуа затем усекает его до первых двух символов с
2<
.Программа Fission действительно работает точно так же, как и сама квин , так как первая и третья строки полностью игнорируются программой.
источник
Ruby + (JavaScript или Python 3), 76 байт
Это еще одна проблема, которую можно решить, используя мой новый любимый язык, почти общее подмножество Ruby, JavaScript и Python 3; и учитывая, что у нас пока нет ответов на экзотерических языках, и многие люди хотели бы видеть решения, не относящиеся к языкам для игры в гольф, я подумала, что предложу один. Более того, один и тот же ответ решает проблему различными способами одновременно.
Вот
s
:Это Quine в Руби. Это не quine в JavaScript или Python 3; если вы запустите его на одном из этих языков, его вывод
s'
будет завершен новой строкой, и поэтому он будет другим:Тем не менее,
s'
это полиглот квин в JavaScript и Python 3! (Как обычно для меня, я использую реализацию JavaScript Rhino как для удобства (так как он запускается из командной строки, а не в браузере), так и потому, что у него есть странная стандартная библиотека, в которой выполняетсяprint
запись в стандартный вывод.) Оба языка производятs'
в результате запуска любой программы.В качестве бонуса эта программа также решает проблему в обратном порядке. Если вы решите работать
s'
в Ruby, он снова напечатает оригинальную программуs
. Таким образом,s'
это правильный (но немного более длинный, 77 байт) ответ на вопрос.На этом этапе я почти начинаю думать, что «различия в том, заканчивается ли вывод выводом строки, достаточным для того, чтобы считать две программы разными», следует считать стандартной лазейкой, учитывая, что это, кажется, второй набор языков. (помимо хорошо известного GolfScript / CJam), в котором можно осуществить трюк.
источник
Вицы (безопасный режим) и Y, 9 байт, неконкурентоспособны.
В Vitsy это quine. В Y это печатает
Ugrd3*Z'
; когда запускается, это печатаетUgrd3*Z'
, что является quine в Y. Y, однако, задним числом вопроса.Что видит Витси:
Что видит Y:
источник
CJam + GolfScript, 9 байт
Это Quine в CJam. В GolfScript это выводит себя с завершающей новой строкой, которая является quine в GolfScript.
Я не уверен, следует ли считать CJam тривиальной производной GolfScript. Но я думаю, что они совершенно разные и, по крайней мере, не тривиальные.
источник