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 P
dans la langue S
. Si un programme valide Q
dans la langue T
est donné en entrée P
, il affichera un programme valide R
dans la langue T
qui ne prend aucune entrée et ne sort pas Q(R)
, c'est-à-dire le programme Q
appliqué 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 R
et la sortie de R
. C'est le code-golf, donc le code le plus court pour les P
victoires.
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
P
doit 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
Q
doivent é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 desQ
en 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
R
doit vraiment être un quine (généralisé), il ne doit donc lire aucune entrée (entrée utilisateur, fichiers, etc.) saufQ
si 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 -> String
fonction 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 P
reçoit la fonction d'identité
f x = x
en entrée, le programme de sortie R
est une quine.