15 votes

Construire des quines (fonctions se reproduisant elles-mêmes)

A-t-il été construit un quine ("Un programme qui génère une copie de son propre texte source en tant que sa sortie complète" : http://www.nyx.net/~gthompso/quine.htm) en R? (La balise [quine] propose de nombreux exemples en Python, Java, ... mais apparemment aucun en R.)

f <- function() { body() }

s'en approche:

> f()
{
    body()
}

mais manque le nom de la fonction.

Qu'en est-il de la possibilité la plus courte? La plus obfusquée?

éditer: de la variété des réponses ci-dessous, il semble qu'il y ait diverses façons de définir l'auto-référentialité et l'environnement dans lequel elle doit se produire:

  • dans l'environnement R: fonction -> fonction (@bill_080)
  • dans l'environnement OS/shell: programme -> programme [plus ou moins équivalent à programme -> texte]: (@kohske)
  • autre: fonction -> texte (@JoshUlrich, @James, problème tel que défini ci-dessus)

Notes:

  • Le thread de R-help souligné par @Spacedman (qui semble mettre l'accent sur l'obfuscation plutôt que la brièveté) suggère que identical(quine,quine()) est un bon cas de test, même si c'est difficile car les environnements sont transportés : identical(quine,quine(),ignore.environment=TRUE) pourrait être plus facile.
  • Un récent (Oct 2015) post de blog fournit une autre réponse ...

1voto

Empiromancer Points 1770

Alors que je ne suis pas sûr si cela "compte" d'un point de vue quine (j'ai rencontré cette question en essayant de vérifier si c'est le cas), le script

function(){}

va produire function(){}. Cela fonctionne sur le même principe que la réponse de Joshua Ulrich, simplement réduit à l'essentiel.

0voto

Ben Bolker Points 50041

Une réponse de @Spacedman, de la liste de diffusion r-help en 2003 (il y a plus d'exemples dans le fil de discussion):

Eh bien, j'ai réussi à modifier une esquisse javascript sur la page web des esquisses pour créer ce monstre - il suffit de tout coller sur une ligne dans un fichier - je l'ai séparé ici pour tenter de plus de clarté:

a=1:10;a[1]='a=1:10;';a[2]='[';a[3]=']';a[4]='\'';a[5]='\\';a[6]='=';a[7]='a';a[8]=';';a[9]='';

a[10]='for(i in 1:10)cat(ifelse(i==1,a[1],a[9])

,a[7],a[2],i,a[3],a[6],a[4],ifelse(i==4||i==5,a[5],a[9]),

a[i],a[4],a[8],ifelse(i==10,a[10],a[9]),sep=a[9])';for(i in 1:10)

cat(ifelse(i==1,a[1],a[9]),a[7],a[2],i,a[3],a[6],a[4],

ifelse(i==4||i==5,a[5],a[9]),a[i],a[4],a[8],ifelse(i==10,a[10],a[9]),sep=a[9])

Cela passe le test du script quine :

$ R --slave < q2.R >q2o.R
$ diff q2.R q2o.R

$

Je suis sûr que si je comprenais, je pourrais l'améliorer...

Version javascript originale par: Geoffrey A Swift (blimey at toke.com) De: http://www.nyx.net/~gthompso/quine.htm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X