Куін
Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі.
Куін (кўін, па-ангельску: 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)
[рэдагаваць] Вонкавыя спасылкі
- The Quine Page — старонка Гары Томпсана (па-ангельску)