Куін

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі

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

Назва[рэдагаваць | рэдагаваць крыніцу]

Праграма была названая ў гонар амэрыканскага лёгіка і філёзафа Ўіларда Куіна (Willard Van Orman Quine), які апрача іншага займаюся вывучэньнем непрамога самаспасыланьня (indirect self-reference).

Прыклад на мове BASIC[рэдагаваць | рэдагаваць крыніцу]

10 LIST

Некаторыя не залічваюць гэта, як куін, бо праграма самой камандай друкуе ўласны код (то бок, доступ да коду забясьпечвае каманда list, а не майстэрства праграміста). Яшчэ адзін прыклад:

10 C=": PRINT CHR(49)+CHR(48)+CHR(32)+CHR(67)+CHR(61)+CHR(34)+C+CHR(34)+C":
PRINT CHR(49)+CHR(48)+CHR(32)+CHR(67)+CHR(61)+CHR(34)+C+CHR(34)+C

Прыклад на мове C[рэдагаваць | рэдагаваць крыніцу]

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

Яшчэ адзін прыклад (павінна быць у адзін радок і запусканая на ASCII-машыне):

extern printf(char*,...);main(){char*a="extern printf(char*,...);
main(){char*a=%c%s%c;printf(a,34,a,34,10);}%c";printf(a,34,a,34,10);}

Альбо яшчэ карацейшы (хаця ён парушае стандарт ISO C99):

main(){char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}

А гэты прыклад не залежыць ад ASCII, за тое выкарыстоўвае прэпрацэсар:

#define T(a) main(){printf(a,#a);}
T("#define T(a) main(){printf(a,#a);}\nT(%s)\n")

Прыклад на мове C++[рэдагаваць | рэдагаваць крыніцу]

(Заўвага: перанос радка дададзены толькі для лепшай чытэльнасьці коду)

#include <iostream>
int main(){const char c=',',dq='"',q[]="'",*s[]={"#include <iostream>",
"int main(){const char c=',',dq='","',q[]=",",*s[]={","};std::cout<<s[0]<<std::endl<<s[1]<<dq<<s[2]
<<dq<<q<<dq<<s[3]<<dq<<s[0]<<dq<<c<<dq<<s[1]<<dq<<c<<dq<<s[2]<<dq<<c<<dq<<s[3]<<dq<<c<<dq<<s[4]<<dq
<<s[4]<<std::endl;}"};std::cout<<s[0]<<std::endl<<s[1]<<dq<<s[2]<<dq<<q<<dq<<s[3]<<dq<<s[0]<<dq<<c
<<dq<<s[1]<<dq<<c<<dq<<s[2]<<dq<<c<<dq<<s[3]<<dq<<c<<dq<<s[4]<<dq<<s[4]<<std::endl;}

Прыклад на мове DOS-абалонкі[рэдагаваць | рэдагаваць крыніцу]

@echo off
%1 %2
call %0 goto e %%
call %0 goto e %%3 echo.%%4
echo :f
goto f
:e
echo.%4@echo off
echo.%4%31 %32
echo.%4call %30 goto e %3%3
echo.%4call %30 goto e %3%33 echo.%3%34
echo.%4echo :f
echo.%4goto f
echo.%4:e
:f

альбо папросту:

more %0.bat

Другі варыянт выкарыстоўвае more — вонкавую каманду, якая па сутнасьці зьяўляецца самастойнай праграмай, таму гэты прыклад крыху некарэктны.

Прыклад на мове HTML (з выкарыстаньнем JavaScript)[рэдагаваць | рэдагаваць крыніцу]

<html><body id="body"><pre id="code">.</pre></body><script type="text/javascript">
	var aflac = (window.ActiveXObject)?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();
	aflac.onreadystatechange = aflacStateChange;
	aflac.open("GET", location.href, true); aflac.send("");	
	function aflacStateChange() {if (aflac.readyState == 4) {addCode(aflac.responseText);}}	
	function addCode(text) {document.getElementById("code").firstChild.nodeValue = text;}
</script></html>

Прыклад на мове Java[рэдагаваць | рэдагаваць крыніцу]

(Заўвага: перанос радка дададзены толькі для лепшай чытэльнасьці коду)

class Q{public static void main(String[]a){char q=34;String t="class Q{public static void main(String[]a){char 
q=34;String t=;System.out.println(t.substring(0,62)+q+t+q+t.substring(62));}}";System.out.println(t.substring
(0,62)+q+t+q+t.substring(62));}}

Прыклад на мове JavaScript[рэдагаваць | рэдагаваць крыніцу]

unescape(q="unescape(q=%220%22).replace(0,q)").replace(0,q)

альбо папросту:

function quine()
{
  // any code here
}
alert(quine);

Прыклад на мове LISP[рэдагаваць | рэдагаваць крыніцу]

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

Прыклад на мове Pascal[рэдагаваць | рэдагаваць крыніцу]

const a='const a=';b='begin write(a,#39,a,#39#59#98#61#39,b,#39#59#10,b) end.';
begin write(a,#39,a,#39#59#98#61#39,b,#39#59#10,b) end.

трошкі палепшаны варыянт:

const a='const a=';b='begin write(a,#39,a,#39#59#98#61#39,b,#39#59,b)end.';
begin write(a,#39,a,#39#59#98#61#39,b,#39#59,b)end.

яшчэ два варыянты (для Borland Pascal і Free Pascal)

const a='const a=;begin write(copy(a,1,8),#39,a,#39,copy(a,9,99)) end.';
begin write(copy(a,1,8),#39,a,#39,copy(a,9,99)) end.
const a:string='const a:string=;begin insert(#39+a+#39,a,16);write(a) end.';
begin insert(#39+a+#39,a,16);write(a) end.

Прыклад на мове Perl[рэдагаваць | рэдагаваць крыніцу]

$_=q{$_=q{Q};s/Q/$_/;print};s/Q/$_/;print

Іншы:

$_=q{print"\$_=q{$_};eval"};eval

Прыклад на мове PHP[рэдагаваць | рэдагаваць крыніцу]

<?
$a='chr(60).chr(63).chr(10).chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59).chr(10)."echo $a;".chr(10).chr(63).chr(62)';
echo chr(60).chr(63).chr(10).chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59).chr(10)."echo $a;".chr(10).chr(63).chr(62);
?>
<?
$a='<?
$a=2;
echo str_replace(1+1,chr(39).$a.chr(39),$a);
?>';
echo str_replace(1+1,chr(39).$a.chr(39),$a);
?>

Прыклад на мове VBScript[рэдагаваць | рэдагаваць крыніцу]

 a="a="":b=left(a,3):c=mid(a,3):msgbox(b+b+c+c)":b=left(a,3):c=mid(a,3):msgbox(b+b+c+c)

Вонкавыя спасылкі[рэдагаваць | рэдагаваць крыніцу]