์ผ๋ฐ˜

Quine

๋ช‡ ๊ฐ€์ง€ ์–ธ์–ด์— ์ž๊ธฐ ์ž์‹ ์„ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ

  • #c
  • #cpp
  • #python

Quine์€ ์‹คํ–‰ ์‹œ ์ด์ „์— ์‹คํ–‰๋œ ์ถœ๋ ฅ๊ณผ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ฉฑ๋“ฑ์„ฑ ์†์„ฑ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Quine์€ "์ž์ฒด ๋ณต์ œ ํ”„๋กœ๊ทธ๋žจ" ๋˜๋Š” "์ž์ฒด ๋ณต์‚ฌ ํ”„๋กœ๊ทธ๋žจ"์œผ๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€์ธ ์„ฑ๋ช…

ํ•œ๊ตญ์–ด ์‹ค๋ ฅ์ด ๋ถ€์ ํ•˜์—ฌ ์ด ๊ธ€์ด ๊ตฌ๊ธ€ ๋ฒˆ์—ญ๊ธฐ๋ฅผ ์ฃผ๋กœ ํ™œ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€์ •ํ™•ํ•œ ๋ฌธ๋ฒ•๊ณผ ์–ดํœ˜๊ฐ€ ์žˆ์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์  ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฌ๋ฉฐ, ์ถ”ํ›„์— ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜์—ฌ ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

C

Example 1
const unsigned char data[] = { /* snip */ };
#include <stdio.h>
int main() {
  printf( "const unsigned char data[] = {" );
  for ( int i=0; i<sizeof(data); i++ ) {
      printf( " %0#4x,", data[i] );
  }
  printf( "\n};\n\n" );
  for ( int j=0; j<sizeof(data); j++)
      putchar( data[j] );
  return 0;
}
Example 2
int main(void) {
  char str[]= " int main(void)\
{ char str[]= %c%s%c;\
printf(str, 0x22, str, 0x22);}";
  printf(str, 0x22, str, 0x22);}
Example 3
main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);}

CoffeeScript

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

Java

public class Quine
{
  public static void main(String[] args)
  {
    char q = 34;      // Quotation mark character
    String[] l = {    // Array of source code
    "public class Quine",
    "{",
    "  public static void main(String[] args)",
    "  {",
    "    char q = 34;      // Quotation mark character",
    "    String[] l = {    // Array of source code",
    "    ",
    "    };",
    "    for(int i = 0; i < 6; i++)           // Print opening code",
    "        System.out.println(l[i]);",
    "    for(int i = 0; i < l.length; i++)    // Print string array",
    "        System.out.println(l[6] + q + l[i] + q + ',');",
    "    for(int i = 7; i < l.length; i++)    // Print this code",
    "        System.out.println(l[i]);",
    "  }",
    "}",
    };
    for(int i = 0; i < 6; i++)           // Print opening code
        System.out.println(l[i]);
    for(int i = 0; i < l.length; i++)    // Print string array
        System.out.println(l[6] + q + l[i] + q + ',');
    for(int i = 7; i < l.length; i++)    // Print this code
        System.out.println(l[i]);
  }
}

JavaScript

s = "s=%j;console.log(s,s)";
console.log(
  s,
  s
)(function a() {
  console.log("(" + a + ")");
})();

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

Lua

s="s=%qprint(s:format(s))"print(s:format(s))

Perl

Example 1
$s='$s=%c%s%c;printf($s,39,$s,39);';printf($s,39,$s,39);
Example 2
$s=q($s=q(%s);printf($s,%s););printf($s,%s);

Python

Example 1
_='_=%r;print (_%%_)';print (_%_)
Example 2
s='s=%r;print(s%%s)';print(s%s)
Example 3
s='s=%r;print(s%%s,sep="")';print(s%s,sep="")

Ruby

Example 1
s="s=%p;printf s,s";printf s,s
Example 2
s="s=%p;print s%%s";print s%s
Example 3
s="s=%p;puts s%%s";puts s%s
Example 4
s="s=%c%s%c;printf s,34,s,34";printf s,34,s,34

Shell

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

Scheme

(define x '(
  (display "(define x '(")
  (newline)
  (map (lambda (s) (write s) (newline)) x)
  (display "))")
  (newline)
  (display "(map eval x)")
  (newline)
  ))
(map eval x)

์ฐธ๊ณ 

Toal, R. Quine Programs. Retrieved 2024, March 24 from https://cs.lmu.edu/~ray/notes/quineprograms/
Bertoldi, D. How to write your first Quine program.ย Towards Data Science. https://towardsdatascience.com/how-to-write-your-first-quine-program-947f2b7e4a6f