Quine (tietokoneohjelma)
Quine on tietokoneohjelma (eräs metaohjelmoinnin muoto), joka tuottaa oman lähdekoodinsa ainoana tulosteenaan ilman ulkoisia syötteitä. Tietokoneharrastajat pyrkivät silloin tällöin huvikseen luomaan lyhimmän mahdollisen quinen millä tahansa ohjelmointikielellä.
Yleensä ohjelmia, jotka yksinkertaisesti avaavat lähdekooditiedoston ja tulostavat sen sisällön (kuten ensimmäinen BASIC-esimerkki alla), pidetään huijauksena.
Lisäksi quinea, joka ei sisällä koodia, ei lasketa sellaiseksi. Monissa ohjelmointikielissä "nollaohjelman" suorittaminen tuottaa tulosteena koodin (eli ei mitään). Tyhjä ohjelma voitti kerran palkinnon "pahimmasta sääntöjen kiertämisestä" Obfuscated C-kilpailussa.
Douglas Hofstadter nimesi Quinet filosofi Willard Van Orman Quinen mukaan, joka tutki laajalti epäsuoraa itseviittausta. Quinet muistuttavat "Quinen paradoksina" tunnettua lausetta: ""Johtaa epätoteen väitteeseen, jos lause lainataan ennen itseään" johtaa epätoteen väitteeseen, jos lause lainataan ennen itseään."
10 LIST
Tätä quinea voidaan pitää "huijauksena", sillä se lukee oman lähdekoodinsa. Tässä toinen esimerkki:
Selkeämpi versio C64 basicilla:
Alla esimerkkiquine Befunge-kielellä:
#include
Toinen (Tämän kuuluisi olla yksi rivi, ja olettaa, että käytössä on [[ASCII]]-merkistöä käyttävä kone):
tai, vielä lyhyemmin (vaikka ei ISO C89-standardin mukaista koodia, lisäksi kumpikaan koodi ei täytä uudempaa ISO C99-standardia):
Tämä versio ei ole ASCII-riippuvainen ja käyttää C:n esikäsittelijää lainausmerkkien ja escape-merkkien tuottamiseen:
Kuten yllä mainittiin, nolla-pituinen ohjelma on teknisesti quine, jos se voidaan kääntää ohjelmatiedostoksi, joka ei tee mitään (ts. tulostaa nolla merkkiä vakiotulosteeseen). Tämä on mahdollista C:ssä virittelemällä Makefileä hieman (sillä oletuksena ei luotaisi suoritettavaa tiedostoa).
#include 
class Q{static void Main(){string s="class Q{0}static void 
Main(){0}string s={2}{3}{2};System.Console.Write(s,'{0}', [91PP[dx]93PP]dx
@echo off
main=putStr$q++show q;q="main=putStr$q++show q;q="
Q
(funcall (lambda (x)
Lyhyempi:
a='a=%c%s%c;a=sprintf(a,39,a,39);disp(a);';a=sprintf(a,39,a,39);disp(a);
(fun s → Printf.printf "%s %S ;;" s s) "(fun s → Printf.printf \"%s %S ;;\" s s)" ;;
const a='const a=';b='begin write(a,#39,a,#39#59#98#61#39,b,#39#59#10,b) end.';
Toinen esimerkki (Borland Pascal ja Free Pascal):
Kolmas esimerkki (Borland Pascal ja Free Pascal):
$_=q{$_=q{Q};s/Q/$_/;print};s/Q/$_/;print
Toinen esimerkki:
shell/Perl-yhdistelmä:
Tämä quine huijaa käyttämällä erityistä codice_1-tiedostokahvaa lähdekoodin hakemiseksi:
 $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)';
Toinen esimerkki:
Kolmas esimerkki: (voidaan pitää huijauksena)
Huom: Esimerkki edellyttää vähintään PHP 4.3-versiota.
<nowiki> %dcl z%z='put edit';proc options(main;q=""put list(m;do i=1,2;z(q)skip;do j=
(dup == {dup cvx exec} pop 8 12 getinterval =)
a='a=%s;print a%%`a`';print a%`a`
Neljä merkkiä lyhyempi muunnos:
Toinen esimerkki:
Sekä kolmas esimerkki jonka 61 viimeistä merkkiä ovat samat kuin edellisessä
(vain sen osoittamiseksi, että usean muuttujan samanaikainen määrittely ei säästä kirjoittamista):
Vielä yksi, joka on hieman luettavampi ja hauskemman näköinen:
puts «2*2,2
Toinen, hieman vaikeammin luettava esimerkki:
((lambda (x)
puts [join [split "puts \[a{a}]" a] {join [split "puts \[a{a}]" a] }]
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)
CLEAR
Alla olevilla merkeillä on samat merkkikoodit kuin quinen tulostamilla. Ne saattavat kuitenkin näyttää tässä erilaisilta muotoilun vuoksi. Jos ohjelman avaa perustekstinkäsittelyohjelmassa kuten MS-DOS Edit, merkit näkyvät kuten ne tulostuvat, todistaen, että kyseessä on quine:
Yllä oleva teksti on tulos, joka saadaan, kun tietokone käsittelee komennot merkkeinä. Alla on komennot heksadesimaalinumeroina. Niiden ja heksaeditorin avulla voidaan luoda suoritettava COM-tiedosto.
Paljon lyhyempi versio ohjelmasta:
mutta tätä voidaan pitää huijauksena, sillä se lukee oman koodinsa.[[Luokka:Ohjelmointi]]