Los Quines
Posted in
Curiosities,
Computers
Tags: metaprogramación, quines
Los Quines son programas cuyo objetivo es imprimirse a sí mismos, es decir, una aplicación que imprime en pantalla su propio código de fuente. Para muchos programadores, es un juego bastante entretenido intentar programar un quine lo más corto posible en un lenguaje determinado. El nombre proviene del filósofo y lógico Willard van Orman Quine (1908-200). En lenguaje de programación, existe un quine si posee la habilidad de imprimir alguna cadena computable, como consecuencia directa del teorema de recursión de Kleene (cualquier función parcial computable puede conjeturar un índice para sí misma):
Corolario: Para cualquier función parcial recursiva Q(x,y) hay un índice p tal que φp(y) +-= λy.Q(p,y)
El corolario demuestra que para cualquier función computable Q de dos argumentos, hay un programa que toma un argumento y evalua Q con el índice de ese mismo programa como el primer argumento y el argumento dado como el segundo. Un clásico ejemplo es la función Q(x,y) = x. El índice correspondiente p en este caso rinde una función computable que hace devolver su propio índice cuando está aplicada a cualquier valor. Cuando esto se expresa como un programa computacional, esos índices son conocidos como quines. El siguiente ejemplo en Lisp ilustra como p en el corolario se puede producir desde la función Q. La función s11 en el código es una función cuyo nombre proviene del teorema S-m-n.
; Q puede cambiarse por cualquier función de aridad 2. (setq Q '(lambda (x y) x)) (setq s11 '(lambda (f x) (list 'lambda '(y) (list f x 'y)))) (setq n (list 'lambda '(x y) (list Q (list s11 'x 'x) 'y))) (setq p (eval (list s11 n n))) ; El resultado de las siguientes expresiones debería ser el mismo. ; φ_p(nil) (eval (list p nil)) ; Q(p, nil) (eval (list Q p nil))
Buscando un poco por la red podremos encontrar miles de quines programados en diferentes lenguajes. Aquí voy a mostrar una lista de quines.
C
main(){char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}
Java
import java.text.*;class a{public static void main(String x[]){char b[]={34};
char c[]={123};String s[]=new String[3];s[0]="import java.text.*;class a{2}
public static void main(String x[]){2}char b[]={2}34};char c[]={2}123};
String s[]=new String[3];s[0]={1}{0}{1};s[1]=new String(b);s[2]=new String(c);
System.out.println(MessageFormat.format(s[0],s));}}";s[1]=new String(b);s[2]=
new String(c);System.out.println(MessageFormat.format(s[0],s));}}
Python
l='l=%s;print l%%`l`';print l%`l`
JavaScript
function a() {
document.write(a, "a()");
}
a()
Perl
$b='$b=%c%s%c;printf$b,39,$b,39;';printf$b,39,$b,39;
Unix Shell
#! /bin/sh
q="'" qq='echo #! /bin/sh;echo q="$q" qq=${q}$qq$q;echo eval $qq'
eval $qq
Referencias | Wikipedia
Referencias | The Quine Page





