Куін

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

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

[рэдагаваць] Прыклад на мове HTML

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

[рэдагаваць] Зьнешнія спасылкі

  • The Quine Page — старонка Гары Томпсана (па-ангельску)