Написать третий заказ Quine


17

Эта задача является продолжением « Гольф взаимного квайна ».

Используя три языка на ваш выбор, создайте программу Ouroboros третьего порядка .

То есть на языке A напишите программу pA, которая выводит программу pB на языке B. Программа pB должна выводить программу pC на языке C, которая, в свою очередь, выводит исходную программу pA на языке A.

Никакие два языка в A, B и C не могут быть одинаковыми или подмножествами или надмножествами друг друга. Ни один из pA, pB или pC не может быть идентичным.

Например, программа на Haskell выводит Perl-программу, которая выводит Java-программу, которая выводит исходную программу на Haskell, будет действительной.

С другой стороны, программа C # 4, которая выводит программу C # 3, которая выводит программу C # 2, недействительна. Даже комбинация Perl -> Ruby -> Bash была бы недействительной, если бы, скажем, программа Perl и программа Ruby были идентичны.

Это код гольф, поэтому выигрывает самая короткая программа ПА.


Ответы:


21

Python -> Perl -> Ruby, 48 символов

Адаптация моего предыдущего ответа . Бег

s='print q<puts %%q{s=%r;print s%%s}>';print s%s

с Python генерирует этот фрагмент Perl

print q<puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}>

который генерирует следующий код Ruby

puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}

который затем печатает оригинальный фрагмент Python:

diff -s <(ruby <(perl <(python thirdorderquine.py))) thirdorderquine.py 
Files /dev/fd/63 and thirdorderquine.py are identical

13

Perl -> PHP -> HTML + JavaScript, 105 символов

Я хотел сделать цепочку языков как-то осмысленной, поэтому я решил написать PHP-скрипт, который генерирует HTML-страницу, содержащую JavaScript. Для третьего языка я выбрал Perl, просто потому что мне нравится Perl. :)

Некоторые могут рассмотреть эти четыре языка, но я не считаю HTML отдельно от JavaScript - это язык разметки, а не язык программирования. Во всяком случае, вот три версии:

Perl (105 символов):

printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/

PHP (165 символов):

<script>alert(unescape("<?=urlencode(<<<E
printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/
E
)?>"))</script>

HTML + JavaScript (235 символов):

<script>alert(unescape("printf%2B%28q%28%3Cscript%3Ealert%28unescape%28%22%3C%3F%3Durlencode%28%3C%3C%3CE%25sprintf%2B%28q%28%25s%29%2C%24%2F%29x2%2C%24%2F%25sE%25s%29%3F%3E%22%29%29%3C%2Fscript%3E%29%2C%24%2F%29x2%2C%24%2F"))</script>

(PS. Да, я знаю, что я мог бы сделать шаг PHP практически пустяком, например, просто сгенерировать код HTML + JS на Perl и добавить <?phpк нему, но это было слишком похоже на читерство. В этом решении код на самом деле обрабатывается в PHP, а не просто дословно копируется.)


3

Недогрузка → sed → Perl, 23 байта

Вероятно, можно снизить это с лучшим выбором языков. Возможно, неконкурентоспособен, потому что правило «программы sed может принимать пустую строку в качестве аргумента» датирует конкурс.

Программа недогрузки:

((iprint+q)Sa(:^)*aS):^

генерирует программу sed:

iprint+q(((iprint+q)Sa(:^)*aS):^)

который генерирует программу Perl:

печать + Q (((печать + Q) Sa (: ^) * As): ^)


(примечание: здесь есть два завершающих символа новой строки), которые снова генерируют исходную программу Underload:

((iprint+q)Sa(:^)*aS):^

Основная цель здесь - найти языки, в которых строки могут быть вложенными (то есть вы можете просто заключить строку в кавычки, заключив ее в разделители, вместо того, чтобы избегать ее); Недостаточная загрузка есть у ()Perl q(), а в sed строка продолжается до пробела (что неявно вкладывается, если в программе нет пробела). Вероятно, есть язык esolang или игра в гольф с инструкцией «напечатать остальную часть текущей строки, а не с последующими строками», которая была бы идеальной здесь, но я не тратил столько времени на ее поиск; в этом случае вы можете сэкономить 8 байтов минус длина инструкции. (Желе почти работает, но его инструкция сама по себе не цитируется. Кроме того, она откладывает вызов.)

Вы можете уменьшить это до 22 байтов следующим образом:

((Csay + д) Sa (: ^) * As): ^

(с одним последним символом новой строки, как обычный текстовый файл, а не с нулем, которое вы обычно получаете в гольфе). Тем не менее, для этого требуется интерпретатор недогрузки, который нормально работает с переводом новой строки как с запретом. Попробуй онлайн!, Но я думаю, что это уже позади.

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