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 ;)