이 페이지는 코딩도장 데이터의 읽기 전용 정적 보관본입니다.

Quine

Quine은 자기 자신을 복사하는 프로그램이다. 즉, 인수를 취하지 않으며, 실행시 자신의 소스코드를 그대로 출력한다.

문제: 당신이 선호하는 언어를 이용해 Quine 프로그램을 작성하라.

  • 단, 소스코드를 프로그램 외부(파일 등)에서 읽어올 경우 존경을 많이 받지 못한다.

위키백과 설명(스포일러이므로 문제를 도저히 못 풀 때만 보세요): http://en.wikipedia.org/wiki/Quine_(computing)

2014/02/20 15:41

박연오

파일을 읽는건 치팅이라는 걸 포함시켜야 될 거 같네요. - *IDLE*, 2015/01/07 18:25

45개의 풀이가 있습니다.

$><<IO.read($0)

2014/02/21 14:35

Kim Jaeju

파이썬 3.2.5 기준입니다.

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

2014/05/24 01:04

Youngjin Shin

펄입니다

open($h,$0);print <$h>;

2015/01/24 09:40

이병곤

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

2015/01/24 23:14

Jinsung Kim

n='n=%r\n\nprint(n%%n)'

print n%n

2015/11/18 21:20

Noh Hun

using System; namespace ConsoleApplication { class Program { static void Main(string[] args) { string s = "using System; namespace ConsoleApplication {2} class Program {2} static void Main(string[] args) {2} string s = {0}{1}{0}; Console.WriteLine(s, (char)34, s, (char)123, (char)125); {3}{3}{3}"; Console.WriteLine(s, (char)34, s, (char)123, (char)125); }}}

위에 코드를 실행화면 아래와 같이 출력됨.

using System; namespace ConsoleApplication { class Program { static void Main(st
ring[] args) { string s = "using System; namespace ConsoleApplication {2} class
Program {2} static void Main(string[] args) {2} string s = {0}{1}{0}; Console.Wr
iteLine(s, (char)34, s, (char)123, (char)125); {3}{3}{3}"; Console.WriteLine(s,
(char)34, s, (char)123, (char)125); }}}

winmerge로 비교시 완벽히 일치 즉, 소스코드를 실행하면 실행화면이 소스코드랑 동일한 quine이다.

2016/09/17 00:40

이 종성

자바스크립트의 재밌는 특징 두가지를 이용했습니다.

  1. IIFE 즉시실행함수

  2. 인자로 넘길 수 있는 function 일급객체

javascript

(function foo() {
    console.log('(' + foo + ')();')
})();

2017/06/16 11:39

funnystyle

이게 무슨 뜻인지조차 이해를 못하겠는데.. 가능하긴 한 일인가요?

2020/04/24 14:52

길고양이

python 2.7

import sys
print open(__file__, 'r').read()

2014/02/27 14:26

Park Jung Wook

heredoc과 eval로 _에 할당하면서 실행시켰습니다.

eval _=<<Quine
puts 'eval _=<<Quine'
puts _
puts 'Quine'
Quine

2014/12/12 00:49

Shim Won

C#으로 작성했습니다. 만들고도 긴가민가 하네요.

using System;

        public void GenerateQuine()
        {
            var quine =
                "public static void GenerateQuine()" +
                "{{\n var quine = {0}{1}{0};" +
                "Console.Write(quine, (char)34, quine); }}";
            Console.Write(quine, (char)34, quine);
        }

2014/12/25 07:11

Straß Böhm Jäger

Perl

$_는 명시 되지 않으면 기본으로 주어지는 값이고 eval은 string을 실행시킵니다.

""만으로는 백슬래시 지옥을 빠져 나올 수 없는데 다행히 q//를 쓸 수 있습니다.

$_=q/print"\$_=q\/$_\/;eval"/;eval

2014/12/31 21:23

*IDLE*

%r 은 python 에서 문자열 출력시 single quote가 추가되어 출력됩니다.
이를 이용해서 Quine 프로그램을 작성할수 있습니다.

coding by python beginner

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

2015/02/03 18:20

vegan

#Python 3.5
q = 'q = %r;import os;os.system("dir>echo");print(str(q %% q))';import os;os.system("dir>echo");print(str(q % q))

2016/01/07 16:40

. anisky07

Ruby

eval quine="print 'eval quine=';p quine" 

다른 방식

quine = "\nputs \"quine = \" + inspect + quine"
puts "quine = " + quine.inspect +  quine

Cheat Quine

$><<IO.read($0) #=> puts IO.read('file') 
  • 알고리즘 : 다음을 출력. 대입문 + 대입된 내용(inspect로) + 변수(출력코드 텍스트)
  • $>는 STDOUT(루비의 pre-defined variable), <<는 내용을 IO로 보내는 메소드.

2016/02/13 23:48

rk

a = chr(39);s = 'a = chr(39);s = {0}{1}{0};print(s.format(a,s))';print(s.format(a,s))

파이썬 3.5.1입니다.

2016/03/13 17:38

Flair Sizz

Python 2.7

a = '''print 'a = ' + "''""'" + a + "''""'"
print a'''
print 'a = ' + "''""'" + a + "''""'"
print a

2016/03/24 20:52

최 재민

위 노훈님과 동일한 아이디어입니다.

do = 'do = %r\nprint(do%%do)'
print(do%do)

2016/03/28 13:36

룰루랄라

? 그냥 이런식으로 하면 되는것인가?? ㅋㅋㅋㅋㅋ

#include <iostream> 
#include <string> 
using namespace std;  

int main(){
    string s = "call me";  
    cout << "#include <iostream>\n#include <string>\nusing namespace std;\n\nint main(){\n\tstring s = \"call me\";\n}\n"; 
}

2016/06/04 15:46

iljimae

count << ... 이부분이 출력에서는 없어지므로 출력이 소스랑 동일하지 않지 않나요? - 이 종성, 2016/09/17 00:46
아무것도 입력하지 않은 상태로 실행하면 아무것도 나오지 않으므로 파일내용('')과 출력('')이 같다
파이썬3.5이다(버전은 상관없겠지만)
아래는 소스코드다

2016/09/04 15:58

차우정

+1 색즉시공 공즉시색 , 완벽한 정답. - 이 종성, 2016/09/17 00:46

Haskell로 작성하였습니다. ghci 에서 아래와 같이 실행하면 됩니다.

(\s -> putStr s >> print s) "(\\s -> putStr s >> print s) "
실행결과
(\s -> putStr s >> print s) "(\\s -> putStr s >> print s) "

2016/09/27 17:58

윤태호

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FIO {
    public static void main(String args[]) {
          String input = "C:/Users/woo/Documents/Visual Studio 2010/Projects/20160927/20160927/20160927.cpp";

          try {
            BufferedReader in = new BufferedReader(new FileReader(input));
            String s;

            while ((s = in.readLine()) != null) {
              System.out.println(s);
            }
            in.close();
          } catch (IOException e) {
              System.err.println(e); // 에러가 있다면 메시지 출력
              System.exit(1);
          }

    }
}

2016/09/29 12:56

코딩초보

import java.util.ArrayList;

public class Quine { public static ArrayList alist = new ArrayList(); public static ArrayList blist = new ArrayList(); public static void main(String args[]) throws Exception
{ PrintFirst(); PrintMiddle(blist) ;
PrintMiddle(alist);
} public static void PrintMiddle(ArrayList plist) { for(String tmp:plist) { System.out.print(tmp+"\r\n"); }

}
public static void PrintParser(String str)
{
    if(str.contains("PrintMiddle(blist);"))
    {
        blist.add("PrintParser(\""+str + "\");");
        PrintMiddle(alist);
        alist.clear();
        PrintMiddle(blist) ;
        blist.clear();
    }else{
        alist.add(str);
        blist.add("PrintParser(\""+str + "\");");           
    }
}
public static void PrintFirst()
{   
    PrintParser("import java.util.ArrayList;");
    PrintParser("import java.util.List;");
    PrintParser("public class Quine {");
    PrintParser("public static ArrayList<String> alist = new ArrayList<String>();");
    PrintParser("public static ArrayList<String> blist = new ArrayList<String>();");
    PrintParser("public static void PrintMiddle(ArrayList<String> plist)");
    PrintParser("{");
    PrintParser("PrintFirst();");
    PrintParser("PrintMiddle(blist) ;");
    PrintParser("PrintMiddle(alist);");
    PrintParser("}");
    PrintParser("public static void PrintMiddle(ArrayList<String> plist)");
    PrintParser("{");
    PrintParser("for(String tmp:plist)");
    PrintParser("{");
    PrintParser("System.out.print(tmp+\"\\r\\n\");");
    PrintParser("}");
    PrintParser("}");   
    PrintParser("public static void PrintParser(String str)");
    PrintParser("{");
    PrintParser("if(str.contains(\"PrintMiddle(blist)\"))");
    PrintParser("{");
    PrintParser("blist.add(\"PrintParser(\\\"\"+str + \"\\\");\");");
    PrintParser("PrintMiddle(alist);");
    PrintParser("alist.clear()");
    PrintParser("PrintMiddle(blist) ;");
    PrintParser("blist.clear();");
    PrintParser("}else{");
    PrintParser("alist.add(str);");
    PrintParser("blist.add(\"PrintParser(\\\"\"+str + \"\\\");\");");
    PrintParser("}");
    PrintParser("}");
    PrintParser("public void PrintFirst()");
    PrintParser("{");
    PrintParser("PrintMiddle(blist);");
    PrintParser("}");
    PrintParser("}");

}

}

2016/10/25 15:51

Leehyosin

include

int main() { char str = "#include %c%cint main() {%c%cchar str = %c%s%c;%c%cprintf(str, 10, 10, 10, 9, 34, str, 34, 10, 9, 10, 10, 9, 10);%c%c%creturn 0;%c}"; printf(str, 10, 10, 10, 9, 34, str, 34, 10, 9, 10, 10, 9, 10);

return 0;

}

2016/12/24 22:43

리코둔

#python2.7xxx
import os
os.system("cat {}".format(os.path.basename(__file__)))

2016/12/30 17:40

Daniel


공.백.의.결.과.는.공.백.이.다.

2017/06/04 23:30

S ReolSt

[Python 3.6]

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

2017/07/22 10:20

Eliya

s = 's = %r\nprint(s%%s)'
print(s%s)

...보고 따라했네요 결국

2017/07/30 01:02

Noname

Clojure 코드입니다.

(println(let[s"(println(let[s%s](format s(pr-str s))))"](format s(pr-str s))))

2017/08/28 18:11

김창동

s = 's = %r\nprint(s%%s)'
print(s%s)

2017/08/31 10:46

piko

밣밤바밤밣밣밤바밤밣받받발밦밣밠밠밡밦밣밣밤밠밤밣밡바받밣밣받바받밤밣밦바바발밣밦밤받받밡받바밣바밣밡밡반밤밣밡바받밣밣바바받밤밣밦바바발밣밦밤받받밡받바밣바밣밤밣반밤밣밡바받밣밣바밡반밤밣밦바바발밣밦밤받받밡받바밣바밣밤밣반밤밣밡바받밣밣밤밣반밤밣밦바바발밣밦바바발밣밡받밣발밣받밣반밤밣받밣반밤밣반반바바바밠발밠밤밣발발받받밣밣밤밣발밣반밠밣밤밣밡발바밤밣밠발바밤밣밣밦밦바밣밠발바밤밣밣밦밦바밣반밠밣밤밣밣밦밦바밣밡발바밤밣밦밦바밤밣발밤밣밡밠밣밠받반밡밡반발밦밣받받발밦밣밡밡밦발밣반바반받밡밡발바밤밣밣밦밦바밣반바반받밡반밠밣밤밣밤밡발밤밣발밤밣밡밠밦발밦받밡반밠밣밤밣밡발바밤밣밡반밦밣밣발바밣밦밣반반바바바밣밠받반밡밠밤밠밤밣발밦받밤밣밦바밣밦밣밣밦밦바밣반바반받밡반밠밣밤밣발밦바밤밣발밠바밣밣밡밤바밤밣밣밦밦바밣반바반받밡반밠밣밤밣밠발바밤밣발밠바밣밣밡발바밤밣밣밦밦바밣반바반받밡반밠밣밤밣밣발바밤밣발밠바밣밣밣발바밤밣받반반반밣발밠바밣밣밠발밦반밡밡밤바밤밣밤반반바밣발반밦받밡반받밠밡밣밤밡발받밣반반바바바반바밦밤밣반반반밤밣밠밤밡바밣밡밣받바밣반발바바밣바바받밤밣밦바바발밣받바밣바밣밤밡반밤밣밤밡반밤밣밡밠밡밡밠밡밠밡밡밠밡밠밡밡밠밡밠밡밡밠밡밠밡밡밠받반발반밡밡밠밡밡밠밡밠밡밡밠받바밣바밣바밡반밤밣밡바받밣밣밤밡반밤밣밦밤받받밡밦밣밦밤밡발발받받밣밠밤밣발밣반반바바바바밤밠바밣밠밤밡바밣밤밤밡밤밣밣발받바밣밣밦밦바밣발밦바밤밣발밤밣밡밠밣발바밤밣밣밦밦바밣밡밤바밤밣발밤밣밡밠발밦바밤밣밣밦밦바밣반밠밣밤밣발발받받밣밠발바밤밣밡밤바밤밣밣밦밦바밣발발받받밣발발받받밣밦밡밦발밣밡밣밤받밣밠발바밤밣밡밤바밤밣밣밦밦바밣밤받밦받밣우
우어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어어
바바싼쑨뷺저벖뻐퍼떠벓저범뻐퍼떠벅저벋뻐퍼떠벅저벅뻐뻐서버버
븂맣설빠밞발따발따빠따밞밤다타싹싼산파밞따파빠북다푸빠밞주쏟
타뷹볅쏠따파빠밣자박따파빠발자밞따파빠밝자밝뚜자토박도표차모
불뱍또두뎌범뻐떠벎벎더더더더더터더더떠벋저벎퍼희맣섣
땨또뺘됴따밣다밝따박다밣따빠맣발박따맣맣삭멓발박따뫃

아희입니다. GitHub repo

2017/09/01 10:57

김창동

with open(__file__, "r") as f:
    print f.read()

2017/11/28 12:58

탐나

Swift입니다.

따옴표가 번번이 발목을 잡았는데, debugDescription이 따옴표를 같이 넘겨주는것을 다른 Swift Quine구현에서 발견했습니다. debugDescription을 못찾았으면 Quine을 못풀었을겁니다.

let a = "func b(){print(\"let a = \\(a.debugDescription)\\n\\(a)\")};b()"
func b(){print("let a = \(a.debugDescription)\n\(a)")};b()

2018/04/27 00:24

졸린하마

별로 존경받지 못하는 외부파일에서 읽어오기 자바소스입니다.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class main4 {
    public static void main(String[] args) {
        File file = new File(".\\src\\main4.java");
        BufferedReader br = null;

        try {
            br = new BufferedReader(new FileReader(file));
            String output = "";

            while((output = br.readLine()) != null){
                System.out.println(output);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2018/07/26 13:25

PuTa

using System;
class A
{
    static void Main()
    {
        string s = @"using System;
class A{{static void Main()
{{string s=@{0}{1}{0};
Console.Write(s,'{0}',s);}}}}";
        Console.WriteLine(s, '"', s);
    }
}

2018/08/16 21:30

정태식

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

컨닝했습니다;;

2018/09/04 20:23

Creator

C#
구글링 끝에 문제는 풀었지만... 쉽지 않네요 :)

using System;
class P
{
    static void Main()
    {
        string s = @"using System;
class P
{{
    static void Main()
    {{
        string s=@{0}{1}{0};
        Console.Write(s, '{0}', s);
    }}
}}
}}";
        Console.Write(s, '"', s);
    }
}

2019/03/27 15:51

mohenjo

def func():
    up ='"'
    well = "'"
    codes=["""
def func():
    up =""","""    well = """,
"""    codes=[""",
"""    ]
    print(codes[0],well+up+well)
    print(codes[1],up+well+up)
    print(codes[2]+up*3,end = "")
    print(codes[0]+up*3+","+up*3,end = "")
    print(codes[1]+up*3+",")
    print(up*3+codes[2]+up*3,",")
    print(up*3+codes[3]+up*3,end ="")
    print(codes[3])

func()
"""    ]
    print(codes[0],well+up+well)
    print(codes[1],up+well+up)
    print(codes[2]+up*3,end = "")
    print(codes[0]+up*3+","+up*3,end = "")
    print(codes[1]+up*3+",")
    print(up*3+codes[2]+up*3,",")
    print(up*3+codes[3]+up*3,end ="")
    print(codes[3])

func()

2019/09/21 01:55

김한길

PHP

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

2019/10/01 16:35

d124412

n='n=%r\n\nprint(n%%n)'

print n%n

이렇게 푸는거군요,, 문제도 이해못했습니다.. 많이 알게되네요

2021/04/02 20:22

fox.j

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

자잔

2022/02/01 14:36

컨티뉴

## 1. 실행시 자신의 소스코드를 그대로 출력하는 Quine 작성

v = '## 1. 실행시 자신의 소스코드를 그대로 출력하는 Quine 작성\n\nv = %r\nprint(v %% v)'
print(v % v)

2022/07/14 20:34

Estelle L

python 3.10입니다. 리스트의 특성을 사용하여 구현하였습니다. 다음은 소스 코드(이자 출력)입니다.

list = ['print ("list =", list)', 'for i in list: print (i)']
print("list =", list)
for i in list: print (i)

2022/07/18 21:32

이준우

파이썬입니다.

1

결과: 1

이런것도 돼나요?

2022/12/10 07:39

조랭이떡

a = 'a = ; print(a[:4]+chr(39)+a+chr(39)+a[4:])'; print(a[:4]+chr(39)+a+chr(39)+a[4:])

2024/06/21 13:56

Shiroha

목록으로