Escribe una quine de tercer orden

17

Este desafío es una extensión de " Golf una quine mutua ".

Usando tres idiomas de su elección, cree un programa Ouroboros de tercer orden .

Es decir, en el lenguaje A, escriba un programa pA que genere el programa pB en el lenguaje B. El programa pB debería generar el programa pC en el lenguaje C, que a su vez genera el programa original pA en el lenguaje A.

No hay dos idiomas en A, B y C que puedan ser iguales o subconjuntos o superconjuntos entre sí. Ninguno de pA, pB o pC puede ser idéntico.

Por ejemplo, un programa Haskell genera un programa Perl que genera un programa java que genera el programa Haskell original sería válido.

Por otro lado, un programa C # 4 que genera un programa C # 3 que genera un programa C # 2 no es válido. Incluso una combinación Perl -> Ruby -> Bash sería inválida si, por ejemplo, el programa Perl y el programa Ruby fueran idénticos.

Este es el código de golf, por lo que gana el programa más corto pA.

Peter Olson
fuente

Respuestas:

21

Python -> Perl -> Ruby, 48 caracteres

Adaptación de mi respuesta anterior . Corriendo

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

con Python genera este fragmento de Perl

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

que genera el siguiente código Ruby

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

que luego imprime el fragmento original de Python:

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

Perl -> PHP -> HTML + JavaScript, 105 caracteres

Quería hacer que la cadena de idiomas fuera de alguna manera significativa, así que pensé que escribiría un script PHP que generara una página HTML que contenga JavaScript. Para el tercer idioma elegí Perl, solo porque me gusta Perl. :)

Algunos podrían considerar estos cuatro idiomas, pero realmente no cuento HTML como separado de JavaScript aquí; es un lenguaje de marcado, no un lenguaje de programación. De todos modos, aquí están las tres versiones:

Perl (105 caracteres):

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

PHP (165 caracteres):

<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 caracteres):

<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. Sí, sé que podría haber hecho que el paso de PHP sea casi noop, por ejemplo, simplemente generar código HTML + JS en Perl y agregarlo <?php, pero eso se parecía demasiado a hacer trampa. En esta solución, el código es en realidad procesado en PHP en lugar de simplemente copiarse textualmente).

Ilmari Karonen
fuente
3

Subcarga → sed → Perl, 23 bytes

Probablemente pueda bajar esto con mejores opciones de idiomas. Podría decirse que no compite porque la regla "los programas sed pueden tomar una línea vacía como argumento" es posterior al concurso.

El programa de baja carga:

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

genera el programa sed:

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

que genera el programa Perl:

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


(nota: aquí hay dos nuevas líneas finales), lo que genera nuevamente el programa Underload original:

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

El objetivo principal aquí es encontrar idiomas en los que las cadenas sean anidables (es decir, puede citar una cadena encerrándola en delimitadores, en lugar de tener que escapar de ella); La carga baja tiene (), Perl tiene q(), y en sed una cadena continúa hasta el espacio en blanco (que es implícitamente anidable si no hay espacios en blanco en el programa). Probablemente haya un lenguaje de esolang o golf con una instrucción "imprime el resto de la línea actual, no seguida de nuevas líneas", lo cual sería ideal aquí, pero no he pasado tanto tiempo buscando uno; podría guardar 8 bytes menos la longitud de la instrucción en ese caso. (Jelly casi funciona pero su instrucción no se cita sola. Además, es posterior al desafío).

Puede reducir esto a 22 bytes de esta manera:

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

(con una nueva línea final, como un archivo de texto normal, en lugar del cero que normalmente obtienes en el golf). Sin embargo, esto requiere un intérprete de baja carga que esté bien con el tratamiento de la nueva línea como no operativa. ¡Pruébalo en línea!, Pero creo que es posterior al desafío.


fuente