Куин

Куин (англ. quine) — компьютерная программа (частный случай метапрограммирования), которая выдает на выходе точную копию своего собственного исходного текста. Многие программисты-любители и хакеры для забавы занимаются разработкой максимально кратких куин-программ.

Программа была названная в честь американского логика и философа Уилларда Ван Ормана Куина (англ. Willard Van Orman Quine), который кроме прочего занимался изучением косвенного самоссылания (англ. indirect self-reference).

Содержание

История

Это хакерский феномен был первоночально описан у Братли (англ. Bratley) и Майлло (англ. Millo), «Computer Recreations; Self-Reproducing Automata», Software — Practice & Experience, издание 2 (1972). стр 397—400.

Братли заинтересовался саморепродуцированием программ после знакомства с первой известной такой программой, написанной на языке программирования Atlas Autocode в Эдинбурге в 1960-ых преподователем и исследователем Хамиш Дево (англ. Hamish Dewar).

Эта первоначальная программа представлена здесь:

%BEGIN
!THIS IS A SELF-REPRODUCING PROGRAM
%ROUTINESPEC R
R
PRINT SYMBOL(39)
R
PRINT SYMBOL(39)
NEWLINE
%CAPTION %END~
%CAPTION %ENDOFPROGRAM~
%ROUTINE R
%PRINTTEXT '
%BEGIN
!THIS IS A SELF-REPRODUCING PROGRAM
%ROUTINESPEC R
R
PRINT SYMBOL(39)
R
PRINT SYMBOL(39)
NEWLINE
%CAPTION %END~
%CAPTION %ENDOFPROGRAM~
%ROUTINE R
%PRINTTEXT '
%END
%ENDOFPROGRAM

Примеры

Больше примеров см. s:en:Quines(англ.)

Си

#include<stdio.h>
char*i="\\#include<stdio.h>",n='\n',q='"',*p=
"%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c%s%c%c;%s%c",*m=
"int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}"
;int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}

Лисп

   (funcall (lambda (x) 
              (append x (list (list 'quote x))))
            '(funcall (lambda (x) 
                         (append x (list (list 'quote x))))))

или T

Brainfuck

(переносы строк добавлены для читабельности)

>>+++++++>>++>>++++>>+++++++>>+>>++++>>+>>+++>>+>>+++++>>+>>++>>+
>>++++++>>++>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+
>>+++++>>+>>+>>+>>++++>>+++++++>>+>>+++++>>++++++++++++++>>+>>+>>
++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+++++
++++++++++++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+
>>+++++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>
>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>++
>>++++>>+++++++>>+>>+++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+>>+
+>>+>>++++++>>+>>+++++>>+++++++>>+>>++++>>+>>+>>++>>+++++>>+>>+++
>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++++++++++++++>>++>>+
+>>+++>>++>>+>>++>>++++>>+++++++>>++>>+++++>>++++++++++>>+>>++>>+
+++>>+>>++>>+>>++++++>>++++++>>+>>+>>+++++>>+>>++++++>>++>>+++++>
>+++++++>>++>>++++>>+>>++++++[<<]>>[>++++++[-<<++++++++++>>]<<++.
.------------------->[-<.>>+<]>[-<+>]>]<<[-[-[-[-[-[-[>++>]<+++++
++++++++++++++++++++++++>]<++>]<++++++++++++++>]<+>]<++>]<<[->.<]<<]

PHP

(переносы строк добавлены для читабельности)

$d='$';$k='$k';$p='$e';$e='eval(\'printf("%sd=%s;$k=%s;%sp=%s;%s=%s;eval(%s);",
$d,var_export($d,true),var_export($k,true),$d,var_export($p,true),$p,var_export($e,true),$p,var_export($p,true),
var_export($k,true),$p);\');';eval($e);

Tcl

 eval [set B {puts "eval \[set B {$B}\]"}]

Ссылки

  • The Quine Page(англ.) — страница Гарри Томпсона.
 
Начальная страница  » 
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 Home