Écrire une quine de troisième ordre

17

Ce défi est une extension de « Golf a quine mutual ».

En utilisant trois langues de votre choix, créez un programme Ouroboros de troisième ordre .

C'est-à-dire, dans la langue A, écrire un programme pA qui sort le programme pB dans la langue B. Le programme pB devrait sortir le programme pC dans la langue C, qui à son tour sort le programme original pA dans la langue A.

Deux langues en A, B et C ne peuvent pas être les mêmes ou des sous-ensembles ou des sur-ensembles l'un de l'autre. Aucun de pA, pB ou pC ne peut être identique.

Par exemple, un programme Haskell génère un programme Perl qui génère un programme Java qui génère le programme Haskell d'origine serait valide.

D'un autre côté, un programme C # 4 qui sort un programme C # 3 qui sort un programme C # 2 n'est pas valide. Même une combinaison Perl -> Ruby -> Bash serait invalide si, disons, le programme Perl et le programme Ruby étaient identiques.

C'est le golf de code, donc le programme le plus court pA gagne.

Peter Olson
la source

Réponses:

21

Python -> Perl -> Ruby, 48 caractères

Adaptation de ma réponse précédente . Fonctionnement

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

avec Python génère cet extrait de code Perl

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

qui génère le code Ruby suivant

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

qui imprime ensuite l'extrait Python original:

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

Perl -> PHP -> HTML + JavaScript, 105 caractères

Je voulais donner un sens à la chaîne de langues, alors j'ai pensé que j'écrirais un script PHP qui génère une page HTML contenant JavaScript. Pour la troisième langue, j'ai choisi Perl, juste parce que j'aime Perl. :)

Certains pourraient considérer ces quatre langages, mais je ne considère pas vraiment HTML comme distinct de JavaScript ici - c'est un langage de balisage, pas un langage de programmation. Quoi qu'il en soit, voici les trois versions:

Perl (105 caractères):

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

PHP (165 caractères):

<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 caractères):

<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. Oui, je sais que j'aurais pu faire de l'étape PHP un quasi-noop, par exemple en générant simplement du code HTML + JS en Perl et en y ajoutant <?php, mais cela ressemblait trop à de la triche. Dans cette solution, le code est en fait traité en PHP au lieu d'être simplement copié mot pour mot.)

Ilmari Karonen
la source
3

Sous-charge → sed → Perl, 23 octets

Peut probablement réduire cela avec de meilleurs choix de langues. Sans doute non compétitif car la règle "les programmes sed peuvent prendre une ligne vide comme argument" est postérieure au concours.

Le programme Underload:

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

génère le programme sed:

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

qui génère le programme Perl:

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


(note: il y a ici deux nouvelles lignes), ce qui génère à nouveau le programme Underload d'origine:

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

Le principal objectif ici est de trouver des langues dans lesquelles les chaînes peuvent être imbriquées (c'est-à-dire que vous pouvez simplement citer une chaîne en l'enfermant dans des délimiteurs, plutôt que d'avoir à l'échapper); Sous-charge a (), Perl a q(), et dans sed une chaîne continue jusqu'à l'espace (qui est implicitement emboîtable s'il n'y a pas d'espace dans le programme). Il y a probablement une langue d'esolang ou de golf avec une instruction "imprimer le reste de la ligne actuelle, non suivie de nouvelles lignes", ce qui serait idéal ici, mais je n'ai pas passé beaucoup de temps à en chercher une; vous pourriez économiser 8 octets moins la longueur de l'instruction dans ce cas. (Jelly fonctionne presque mais son instruction ne se cite pas. En outre, elle remet le défi à jour.)

Vous pouvez réduire cela à 22 octets comme ceci:

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

(avec une nouvelle ligne de fin, comme un fichier texte normal, plutôt que le zéro que vous obtenez normalement au golf). Cependant, cela nécessite un interpréteur Underload qui accepte de traiter la nouvelle ligne comme un no-op. Essayez-le en ligne!, Mais je pense que cela remonte au défi.


la source