Куін
Куін (па-ангельску: 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)