Quine

A Quine program vagy a Quine olyan program, amely végrehajtáskor saját forráskódot ad ki. A Quine nem léphet ki önmagán, például úgy, hogy kinyomtatja az őt tartalmazó fájl tartalmát, vagy introspektív képességeket használ saját reprezentációjának kinyomtatására. Ehelyett ki kell számítania a saját forráskódját.


Egy ilyen program létrehozásának klasszikus módja két lépésben történik:

  1. Inicializáljon egy karakterlánc-változót egy helyőrzővel az interpolációhoz.
  2. Nyomtassa ki a karakterláncot és interpolálja önmagába .

A trükk abban rejlik, hogy a húr megfelelő legyen. Ennek módja nyelvenként változó, és a változó deklarálási módjától, a pontosvesszők és újsorok szükségességétől, a szükséges idézőjelektől stb. Érdekes az idézőjel használata; Meg kell találni a módját annak jelzésére, hogy az idézőjelet ténylegesen idézőjel nélkül kell nyomtatni.

Bash

A legtöbb Bash-hoz hasonlóan ez a program is egy érdekes furcsaságot használ. Bár az egyetlen idézőjel erős idézőjel, és nem bővít ki semmit, értelmezve printf nyolcas escape karakterek a megadott kódponttal rendelkező karakterekként:

s='s=\47%s\47;printf "$s" "$s"';printf "$s" "$s"

Piton

A Pythonban a formátumspecifikátor tér vissza %r automatikusan szimpla idézőjelek. A legegyszerűbb, ha a kód újsor karakterrel végződik:

s='s=%r;print(s%%s)';print(s%s)

Ha sortörés nélküli kódot szeretne, akkor a következőket kell beírnia:

s='s=%r;print(s%%s,sep="")';print(s%s,sep="")

JavaScript

A következő JavaScript-quines node.js alatt futnak. használsz console.log, amely mindig új sort fűz hozzá, így minden szkript végén új sorra van szükség:

s="s=%j;console.log(s,s)";console.log(s,s)

A következő program is érdekes: nem írja ki a teljes reprezentációját, hanem arra támaszkodik, hogy a függvényeknek van bizonyos reprezentációja:

(function a(){console.log('('+a+')()')})()

A következő példa közel áll a csaláshoz, mert az eval használt:

code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)

Rozsda

A Rust lehetőséget biztosít arra, hogy a formázott nyomtatási makrójában idézőjelbe tegyen egy argumentumot. Ez a makró azonban megköveteli, hogy a nyomtatási makró első argumentuma karakterlánc literál legyen! Ezért a legjobb a pozíciós argumentumazonosítót használni:

fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}

PHP

Ez a PHP program úgy működik, hogy a forráskódot egy karakterláncban tárolja, majd ezt a karakterláncot használja printf kimenetek. A 39 az ASCII karaktert jelöli ', hogy helyesen kezelje az idézőjeleket a karakterláncban:

<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);

HQ9+

Végül, de nem utolsósorban a Cliff Biffle által fejlesztett HQ9+:

Q
Vissza