less_retarded_wiki/quine.md
2024-02-17 10:47:29 +01:00

3.3 KiB

Quine

Quine is a nonempty program which prints its own source code. It takes no input, just prints out the source code when run (without cheating such as reading the source code file). Quine is basically a self-replicating program, just as in real world we may construct robots capable of creating copies of themselves (afterall we humans are such robots). The name quine refers to the philosopher Willard Quine and his paradox that shows a structure similar to self-replicating programs. Quine is one of the standard/fun/interesting programs such as hello world, compiler bomb, 99 bottles of beer or fizzbuzz.

From mathematical point of view quine is a fixed point of a function (not to be confused with fixed_point arithmetic) represented by the programming language. I.e. if we see the programming language as a function f(x), where x is source code and the function's output is the program's output, quine is such x that f(x) = x.

Similar efforts include e.g. making self matching regular expressions (for this task to be non-trivial the regex has to e.g. be enclosed between /s). Yet another similar challenge is a polyglot program -- one that is a valid program in several languages -- some programs can be quines and polyglots at the same time, though these are super hard to make.

Quine can be written in any Turing complete language (according to Wikipedia), the challenge is in the self reference -- normally we cannot just single-line print a string literal containing the source because that string literal would have to contain itself, making it infinite in length. The idea commonly used to solve this problem is following:

  1. On first line start a definition of string S, later copy-paste to it the string on the second line.
  2. On second line put a command that prints the first line, assigning to S the string in S itself, and then prints S (the second line itself).

This is a quine in C:

#include <stdio.h>
char s[] = "#include <stdio.h>%cchar s[] = %c%s%c;%cint main(void) { printf(s,10,34,s,34,10,10); return 0; }";
int main(void) { printf(s,10,34,s,34,10,10); return 0; }

This is a quine in Python:

s="print(str().join([chr(115),chr(61),chr(34)]) + s + str().join([chr(34),chr(10)]) + s)"
print(str().join([chr(115),chr(61),chr(34)]) + s + str().join([chr(34),chr(10)]) + s)

This is a quine in comun:

0 46 32 34 S 34 32 58 83 S --> S: "0 46 32 34 S 34 32 58 83 S --> " .

TODO: more langs?

Yet a stronger quine is so called radiation hardened quine, a quine that remains quine even after any one character from the program has been deleted (found here in Ruby: https://github.com/mame/radiation-hardened-quine). Other plays on the theme of quine include e.g. a program that produces a bigger program which will again produce yet bigger program etc.

In the Text esoteric programming language every program is a quine (and so also a radiation hardened one).

See Also