Написать Семихин

10

Предположим, у вас есть 2 языка, Aи B. Строка sявляется полухинией, Aи Bесли она удовлетворяет следующим условиям:

  1. sэто квин на языке A.
  2. sполиглот в Aа B.
  3. Результатом работы 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 могло бы упростить задачу.

Mego
источник
Разрешены ли блоки копирования ESMin?
lirtosiast
@ThomasKwa Я не знаком с ESMin, поэтому не могли бы вы дать мне краткое изложение?
Мего
Есть команда для запуска блока копирования, которая получает исходный код всего, что было после него. Я думаю, что другие языки игры в гольф JS тоже могут быть.
lirtosiast
@ThomasKwa Это не будет разрешено в соответствии с первым правилом в правилах квина (без чтения исходного кода, прямо или косвенно).
Мего
1
@ Downgoat Пока это не нарушает никаких других правил, абсолютно. Злоупотребление причудами является целью этого сайта :)
Mego

Ответы:

6

GolfScript + Fission , 19 18 байт

{".~
'!+OR"
2<}.~

Конечный перевод строки необходим.

Это настоящий quine в GolfScript. Попробуйте онлайн!

В Fission это печатает

'!+OR"

который является истинным Quine в делении . Попробуйте онлайн!

объяснение

В GolfScript все что угодно

{...}.~

является quine до тех пор, пока ...оставляет строку ".~"в стеке. .Дублирует блок, таким образом, что есть одна копия , которая печатается в конце концов, и ~выполняет его, поэтому мы можем использовать его содержимое для печати .~себя. В этом случае блок выталкивает строку

".~
'!+OR"

а затем усекает его до первых двух символов с 2<.

Программа Fission действительно работает точно так же, как и сама квин , так как первая и третья строки полностью игнорируются программой.

Мартин Эндер
источник
6

Ruby + (JavaScript или Python 3), 76 байт

Это еще одна проблема, которую можно решить, используя мой новый любимый язык, почти общее подмножество Ruby, JavaScript и Python 3; и учитывая, что у нас пока нет ответов на экзотерических языках, и многие люди хотели бы видеть решения, не относящиеся к языкам для игры в гольф, я подумала, что предложу один. Более того, один и тот же ответ решает проблему различными способами одновременно.

Вот s:

s="'";d='"';n='print("s="+d+s+d+";d="+s+d+s+";n="+s+n+s+";eval(n)")';eval(n)

Это Quine в Руби. Это не quine в JavaScript или Python 3; если вы запустите его на одном из этих языков, его вывод s'будет завершен новой строкой, и поэтому он будет другим:

s = "'", г =' " '; п =' печати (" S = "+ D + S + D +", г = "+ S + D + S +"; п = "+ з + п + з +" ; Eval (п) ") '; Eval (п)

Тем не менее, s'это полиглот квин в JavaScript и Python 3! (Как обычно для меня, я использую реализацию JavaScript Rhino как для удобства (так как он запускается из командной строки, а не в браузере), так и потому, что у него есть странная стандартная библиотека, в которой выполняется printзапись в стандартный вывод.) Оба языка производят s'в результате запуска любой программы.

В качестве бонуса эта программа также решает проблему в обратном порядке. Если вы решите работать s'в Ruby, он снова напечатает оригинальную программу s. Таким образом, s'это правильный (но немного более длинный, 77 байт) ответ на вопрос.

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


источник
2

Вицы (безопасный режим) и Y, 9 байт, неконкурентоспособны.

' Ugrd3*Z

В Vitsy это quine. В Y это печатает Ugrd3*Z'; когда запускается, это печатает Ugrd3*Z', что является quine в Y. Y, однако, задним числом вопроса.

Что видит Витси:

 ' Ugrd3*Z
 '         Heyyyy a string! Let's do this!
  ........ Capturing a string! Oh, not done? Hm, let's go back to the start.
 '         There we go.
           (space) ...
   U       (no op)
    g      use count, disabled in safe mode
     r     reverse stack
      d3*  push a '
         Z print it all!

Что видит Y:

' Ugrd3*Z
'         Push a space.
  U       Wrap around and capture.
   g      Print that. (Nothing else is printed.)
Конор О'Брайен
источник
1
Обратите внимание, что это работает только в безопасном режиме, или, скорее, имеет некоторые ... непреднамеренные побочные эффекты в небезопасном режиме.
Эддисон Крамп
1

CJam + GolfScript, 9 байт

"0$p"
0$p

Это Quine в CJam. В GolfScript это выводит себя с завершающей новой строкой, которая является quine в GolfScript.

Я не уверен, следует ли считать CJam тривиальной производной GolfScript. Но я думаю, что они совершенно разные и, по крайней мере, не тривиальные.

jimmy23013
источник