Recherche

Peut être aimerez-vous...

Mais c'est quoi une quine ? Envoyer
Vivons avec Internet - La vie sur Internet
Écrit par Neamar   
Samedi, 21 Novembre 2009 10:01

Peut être en avez-vous déjà entendu parler, vu des bouts de code étranges...
Une quine est un programme qui s'écrit lui-même sur la sortie standard. Autrement dit, l'exécution du programme affiche le code source du programme.

Quelques règles structurent ce jeu à priori trivial, la principale étant bien sûr l'interdiction d'accéder au fichier contenant le code source ! Y a des limites à la facilité, namého.
Une fois muni de cette contrainte, le jeu devient nettement plus intéressant.
L'approche de base étant bien entendu de mettre le programme dans une variable de type chaîne de caractères. Le problème ? Que met-on au moment de redéfinir la variable dans le String ? Si on recopie le programme, on obtient un programme de taille infinie ! (e.g. var i:String="var i:String=\"var i:String="). Il faut donc ruser pour écrire sa quine ! Et n'abandonnez pas : si votre langage est Turing Complet (comme la quasi totalité des langages), vous pouvez faire une quine avec.

Ci-dessous, quelques exemples de quine.

Je présente ici deux exemples de quine, vous en trouverez une liste bien plus complète (mais toujours aussi peu exhaustive) sur The Quine page.

En JAVA

 
class S
{
  public static void main(String[]a)
  {
    String s="class S{public static void main(String[]a){String s=;char c=34;System.out.println(s.substring(0,52)+c+s+c+s.substring(52));}}";
    char c=34;
    System.out.println(s.substring(0,52)+c+s+c+s.substring(52));
  }
}
 

Ici l'astuce consiste à encoder le guillemet (034) sous forme de Char et à s'en resservir. Comme vous le devinez aisément, le caractère 52 du string s est au niveau de la définition de s dans s (oui, je me comprends).
Notons l'ajout de sauts de lignes et des tabulations ici pour faciliter la lecture du code, mais normalement la quine se présente sur une seule ligne.

 
class S{public static void main(String[]a){String s="class S{public static void main(String[]a){String s=;char c=34;System.out.println(s.substring(0,52)+c+s+c+s.substring(52));}}";char c=34;System.out.println(s.substring(0,52)+c+s+c+s.substring(52));}}
 

En JAVASCRIPT

 
unescape(q="unescape(q=%22*%22).replace('*',q)").replace('*',q)
 

Que dire ? Le caractère %22 est bien entendu le ". On remplace ensuite toutes les * par la variable.

En FRANÇAIS

recopier puis recopier entre guillemets la phrase "recopier puis recopier entre guillemets la phrase".

Ici, c'est le lecteur qui sert de compilateur ;)

Mise à jour le Lundi, 23 Novembre 2009 22:12
 

Ajouter votre commentaire

Votre nom:
Votre site web:
Sujet:
Commentaire (vous pouvez utiliser de balises HTML ici):
  Code de vérification. Lettres minuscules seulement et sans espace.
Code de vérification: