Le défi
Dans ce défi, vous spécifiez une langue source S et une langue cible T . Votre tâche consiste à écrire le programme suivant Pdans la langue S. Si un programme valide Qdans la langue Test donné en entrée P, il affichera un programme valide Rdans la langue Tqui ne prend aucune entrée et ne sort pas Q(R), c'est-à-dire le programme Qappliqué au code source de R. De plus , vous devez présenter dans votre réponse un exemple de programme non trivial Q(le plus intéressant, le meilleur, bien que vous ne marquiez aucun point pour cela), le programme résultant Ret la sortie de R. C'est le code-golf, donc le code le plus court pour les Pvictoires.
En d'autres termes, il s'agit d'un défi d'écrire un "constructeur de quine universel" qui peut créer des types arbitraires de quines généralisés.
Clarifications
- Vos langues source et cible peuvent être identiques.
- Le programme
Pdoit prendre une chaîne en entrée (depuis STDIN ou équivalent) et produire une chaîne (vers STDOUT ou équivalent), comme tout programme de sortieR. - Les programmes d'entrée
Qdoivent également transformer une chaîne en une autre chaîne, mais leur forme est plus flexible: il peut s'agir de fonctions chaîne à chaîne, d'extraits de code qui modifient une variable avec un certain nom, d'extraits qui modifient la pile de données si votre langue cible en a un, etc. Vous pouvez également restreindre davantage la forme desQen indiquant que, par exemple, ils ne peuvent contenir aucun commentaire. Cependant, vous devez être en mesure d'implémenter n'importe quelle fonction chaîne à chaîne calculable en tant que programme d'entréeQ, et vous devez indiquer explicitement comment ils fonctionnent et quelles contraintes supplémentaires vous leur imposez. - Le programme de sortie
Rdoit vraiment être un quine (généralisé), il ne doit donc lire aucune entrée (entrée utilisateur, fichiers, etc.) saufQsi c'est le cas. - Les failles standard ne sont pas autorisées.
Un exemple
Supposons que je choisis Python comme langue source et Haskell comme langue cible, et que je demande en outre que le programme d'entrée soit une définition sur une ligne d'une String -> Stringfonction nommée f. Si je donne le programme d'inversion de chaîne
f x = reverse x
en entrée de mon programme Python P, il affichera le code source d'un autre programme Haskell R. Ce programme imprime dans STDOUT le code source de R, mais inversé. Si Preçoit la fonction d'identité
f x = x
en entrée, le programme de sortie Rest une quine.