Напишіть квітку третього порядку


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 були однаковими.

Це кодовий гольф, тому виграє найкоротша програма pA.


Відповіді:


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>

(Пс. Так, я знаю, що я міг би зробити крок PHP майже noop, наприклад, просто генеруючи HTML + JS-код у Perl та додаючи <?phpдо нього, але це занадто схоже на обман. У цьому рішенні код насправді є обробляється в PHP, а не просто копіюється дослівно.)


3

Низьке завантаження → sed → Perl, 23 байти

Можливо, можна знизити це з кращим вибором мов. Можливо, є неконкурентоспроможними, оскільки правило "програми sed можуть приймати порожній рядок як аргумент" подає заявку на конкурс.

Програма Underload:

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

генерує програму sed:

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

яка генерує програму Perl:

друк + q (((друк + q) Sa (: ^) * aS): ^)


(зверніть увагу: тут є два останніх рядки), що знову генерує оригінальну програму Underload:

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

Основна мета тут - знайти мови, на яких рядки нестабільні (тобто ви можете просто процитувати рядок, уклавши його в роздільники, а не уникати його); У Perload є (), Perl є q(), і в sed-рядок триває до пробілу (який неявно нестабільний, якщо в програмі немає пробілу). Напевно, там є мова про езоланг або гольф із інструкцією «надрукувати решту поточного рядка, а не слідувати новим рядкам», яка була б ідеальною тут, але я не витратив весь стільки часу на пошуки такого; у цьому випадку ви можете зберегти 8 байт мінус довжину інструкції. (Jelly майже працює, але його інструкція не цитує себе. Крім того, вона ставить перед собою виклик.)

Ви можете зменшити це до 22 байтів так:

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

(з одним кінцевим новим рядком, як звичайний текстовий файл, а не нулем, який ви зазвичай отримуєте в гольфі). Однак для цього потрібен інтерпретатор Underload, який у порядку, коли новий рядок трактується як неоперативний. Спробуйте це в Інтернеті! Але я думаю, що це вирішує проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.