Куін

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

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

## Прыклад на мове ''[[BASIC]]''

```qbasic
10 LIST
```


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


```qbasic
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 (мова праграмаваньня)|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]]*-машыне):


```c
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]]*):


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


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


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


## Прыклад на мове ''[[C плюс плюс|C++]]''

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


```cpp
#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]]''-абалонкі

```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
```


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


```dos
more %0.bat
```


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

## Прыклад на мове ''[[HTML]]'' (з выкарыстаньнем ''[[JavaScript]]'')


```html4strict
<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]]''

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


```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]]''


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


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


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


## Прыклад на мове ''[[LISP]]''


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


## Прыклад на мове ''[[Pascal]]''

```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.
```

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

```pascal
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]]*)

```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.
```


```pascal
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]]''


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


Іншы:


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


## Прыклад на мове ''[[PHP]]''


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


```php
<?
$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]]''


```vb
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)
```


## Вонкавыя спасылкі
* The Quine Page — старонка Гары Томпсана

Катэгорыя:Праграмаваньне