Quine(컴퓨팅)
Quine (computing)쿼인은 입력을 받지 않고 자체 소스 코드의 복사본을 유일한 출력으로 생성하는 컴퓨터 프로그램입니다.계산 가능성 이론 및 컴퓨터 과학 문헌에서 이러한 프로그램의 표준 용어는 "자기 복제 프로그램", "자기 복제 프로그램" 및 "자기 복제 프로그램"입니다.
quine은 실행 환경이 프로그램을 출력으로 변환하는 함수로 간주될 때 실행 환경의 고정점입니다.퀴인은 클린의 재귀정리의 직접적인 결과로 모든 튜링완성 프로그래밍 언어에서 가능하다.재미를 위해 프로그래머들은 때때로 주어진 프로그래밍 언어로 가능한 가장 짧은 quine을 개발하려고 시도한다.
"퀴네"라는 이름은 더글라스 호프스타터가 그의 인기 과학 책인 괴델, 에셔, 바흐에서 간접적 자기 참조에 대한 광범위한 연구를 한 철학자 윌러드 반 오르만 퀴네(1908-2000)를 기리기 위해, 그리고 특히 퀴네의 역설로 알려진 다음과 같은 표현을 위해 만든 것입니다.
"인용 앞에 거짓을 낳다"는 인용 앞에 거짓을 낳는다.
역사
오토마타의 자기 재생은 컴퓨팅의 시작에서 비롯되었습니다(이전까지는 아니더라도).존 폰 노이만은 1940년대에 그들에 대해 이론을 세웠다.후에,[1] Paul Bratley와 Jean Millo의 기사 "Computer Recations: Self-Reproducting Automata"는 1972년에 그것들을 논의했다.브래틀리는 1960년대 에든버러 대학의 강사이자 연구원인 해미시 드워가 아틀라스 오토코드에서 작성한 최초의 자기 재생 프로그램을 보고 처음으로 자기 재생 프로그램에 관심을 갖게 되었다.
Affero General Public License의 "다운로드 소스" 요건은 Quine의 [2]개념을 기반으로 합니다.
예
건설용 퀀즈
일반적으로 임의의 프로그래밍 언어로 quine을 작성하기 위해 사용되는 방법은 프로그램 내에 (a)실제 인쇄에 사용되는 코드와 (b) 코드의 텍스트 형식을 나타내는 데이터의 두 조각을 갖는 것이다.코드는 데이터를 사용하여 코드를 인쇄하는 방식으로 작동하지만(데이터가 코드의 텍스트 형식을 나타내므로 의미가 있음), 데이터 자체의 텍스트 표현을 인쇄하기 위해 데이터를 단순하게 사용하기도 합니다.
다음은 Python 3의 세 가지 작은 예입니다.
a='a='%s%s%s인쇄(a)%%(139(39), a, 139(39)),;인쇄물(a%(크르(39),a,크르(39))) b='b='{}{}{};print(b.format(b.format(39), b, b, filter(39)),;인쇄물(b.포맷(크르(39),b,크르(39))) c='c='%r인쇄(c)%%c)';인쇄물(c%c) # %r은(는) 자동으로 견적을 내는 것에 주의해 주세요.
다음 Java 코드는 Quine의 기본 구조를 보여줍니다.
일반의 학급 퀴네 { 일반의 정적인 무효 주된(스트링[] args) { 차 q = 34; // 따옴표 문자 스트링[] l = { // 소스 코드 배열 "공공 클래스 Quine", "{", "public static void main(String[] args)", " {", " char q = 34; // 따옴표 문자", "String [] l = {// 소스 코드 배열", " ", " };", " for (int i = 0; i < 6; i++) // 개방 코드 인쇄", " System . out . println ( l [ i ] );", " for (int i = 0; i < l . length ; i+ + ) // 문자열 배열 인쇄", "System.out.println (l[6] + q + l[i] + q + ' ' ) ;, " for (int i = 7; i < l . length ; i+ + ) // 이 코드 인쇄", " System . out . println ( l [ i ] );", " }", "}", }; 위해서(인트 i = 0; i < > 6; i++) // 오프닝 코드 인쇄 시스템..나가..인쇄(l[i]); 위해서(인트 i = 0; i < > l.길이; i++) // 문자열 배열 인쇄 시스템..나가..인쇄(l[6] + q + l[i] + q + ','); 위해서(인트 i = 7; i < > l.길이; i++) // 이 코드 인쇄 시스템..나가..인쇄(l[i]); } }
소스 코드에는 자체 문자열 배열이 포함되어 있습니다. 문자열 배열은 따옴표 안에 두 번 출력됩니다.
이 코드는 저자 제이슨 윌슨이 자바 [3]코멘트 없이 Quine의 미니멀리즘 버전으로 게시한 c2.com의 원래 게시물에서 수정되었습니다.
Java 15(또는 그 이후)의 새로운 텍스트 블록 기능을 통해 보다 읽기 쉽고 간단한 버전이 가능합니다.[4]
일반의 학급 퀴네 { 일반의 정적인 무효 주된(스트링[] args) { 스트링 텍스트 블록 따옴표 = 신규 스트링(신규 차[]{'"', '"', '"'}); 차 newLine(신규라인) = 10; 스트링 원천 = """ 퍼블릭 클래스 Quine { public static void main(String[] args) { 문자열 textBlockQuotes = 새 문자열(new char[]{'")', '"', '"'}); 차 newLine(신규라인) = 10; 스트링 원천 = %s; 시스템..나가..인쇄물(원천.포맷했다(텍스트 블록 따옴표 + newLine(신규라인) + 원천 + 텍스트 블록 따옴표)); } } """; System.out.print(소스).formated (text Block Quotes + newLine + source + text Block Quotes ) ; } }
평가 쿼리
일부 프로그래밍 언어에는 문자열을 프로그램으로 평가할 수 있는 기능이 있습니다.Quines는 이 기능을 이용할 수 있습니다.예를 들어, 이 Ruby Quine은 다음과 같습니다.
평가하다 s="'eval s=';p s" 인쇄"
Lua의 장점:
s="프린트(문자열)"포맷을 지정합니다.; 장전(s)()
Python 3.8의 경우:
이그제큐티브(s:='인쇄: =' (s:=)%r)"%s)')
'사기' 퀴즈
자기평가
Scheme 및 기타 Lisps를 포함한 많은 기능 언어 및 APL과 같은 대화형 언어에서 숫자는 자가 평가됩니다.TI-BASIC에서는 프로그램의 마지막 행이 값을 반환하면 반환된 값이 화면에 표시됩니다.따라서 이러한 언어에서 한 자리 숫자로만 구성된 프로그램은 1바이트의 쿼인이 됩니다.이러한 코드는 자체적으로 구축되지 않기 때문에, 이것은 종종 부정행위로 간주됩니다.
1
또 다른 예로는 인터랙티브 Python 기능이 있습니다.이 기능에서는 밑줄 기호가 이전 행의 값을 할당합니다.
'%r\n인쇄(_)%%_)' 인쇄물(_%_)
일부 언어(특히 스크립트 언어)에서 빈 소스 파일은 언어의 고정점이며 출력을 [a]생성하지 않는 유효한 프로그램입니다.'세계에서 가장 작은 자기 재생 프로그램'으로 출품된 이 빈 프로그램은 국제 난독화 [5]C코드 공모전에서 '규칙의 최악의 악용'상을 받은 적이 있다.이 프로그램은 실제로 컴파일된 것이 아니라 사용되었습니다.cp
파일을 다른 파일로 복사하여 아무것도 [6]인쇄하지 않도록 실행할 수 있습니다.
기타 의심스러운 기술로는 컴파일러 메시지 사용이 있습니다.예를 들어 GW-BASIC 환경에서 "Syntax Error"를 입력하면 인터프리터가 "Syntax Error"로 응답합니다.
소스코드 검사
정의에 따르면 Quines는 파일 읽기를 포함한 어떤 형태의 입력도 받을 수 없습니다. 즉, Quines는 자신의 소스 코드를 보면 "치팅"하는 것으로 간주됩니다.다음 셸 스크립트는 쿼인이 아닙니다.
#!/bin/sh # 잘못된 쿼리입니다.# 디스크에서 실행된 파일을 읽는 것은 부정 행위입니다.cat $0
shebang 지시어의 동작을 이용하는 보다 짧은 변형:
#!/bin/cat
우로보로스 프로그램
quine 개념은 재귀의 여러 레벨로 확장되어 "uroboros 프로그램" 또는 quine-relay를 발생시킬 수 있습니다.이 값을 멀티쿼인과 혼동하지 마십시오.
예
이 Java 프로그램은 원래 Java 코드를 출력하는 C++ 프로그램의 소스를 출력합니다.
#실패하다 <iostream> #실패하다 <문자열> 사용. 네임스페이스 표준; 인트 주된(인트 argc, 차* argv[]) { 차 q = 34; 스트링 l[] = { " ", "=============<<<< C++코드>>>>=============", "#module <iostream>", "#cring <문자열>", "네임스페이스 표준 사용;", "", "int main(int argc, char*argv[])", "{", " char q = 34;", " 문자열 l[] = {", " };", " for(int i = 20, i <= 25, i++)", " cout << l[i] << endl;", " for (int i = 0, i < = 34, i++)", " cout << l[0] + q + l[i] + q + ' , < endl ; ", " for (int i = 26, i < = 34, i++)", " cout << l[i] << endl;", "0을 반환한다;", "}", "============= < < < < < Java Code > > > =============", "공공 클래스 Quine", "{", "public static void main(String[] args)", " {", " char q = 34;", " 문자열 [] l = {", " };", " for(int i = 2; i < = 9; i++)", "System.out.println ( l [ i ] );, " for (int i = 0, i < l . length ; i++)", "System.out.println(l[0] + q + l[i] + q + ' ' ) ;, " for (int i = 10, i < = 18, i++)", " System . out . println ( l [ i ] );", " }", "}", }; 위해서(인트 i = 20; i <=> 25; i++) 외치다 << > l[i] << > 끝; 위해서(인트 i = 0; i <=> 34; i++) 외치다 << > l[0] + q + l[i] + q + ',' << > 끝; 위해서(인트 i = 26; i <=> 34; i++) 외치다 << > l[i] << > 끝; 돌아가다 0; }
일반의 학급 퀴네 { 일반의 정적인 무효 주된(스트링[] args) { 차 q = 34; 스트링[] l = { " ", "=============<<<< C++코드>>>>=============", "#module <iostream>", "#cring <문자열>", "네임스페이스 표준 사용;", "", "int main(int argc, char*argv[])", "{", " char q = 34;", " 문자열 l[] = {", " };", " for(int i = 20, i <= 25, i++)", " cout << l[i] << endl;", " for (int i = 0, i < = 34, i++)", " cout << l[0] + q + l[i] + q + ' , < endl ; ", " for (int i = 26, i < = 34, i++)", " cout << l[i] << endl;", "0을 반환한다;", "}", "============= < < < < < Java Code > > > ==========", "공공 클래스 Quine", "{", "public static void main ( String [ ]args )", " {", " char q = 34;", " 문자열 [] l = {", " };", " for(int i = 2; i < = 9; i++)", " System . out . println ( l [ i ] );", " for (int i = 0, i < l . length ; i++)", System.out.println( l[0] + q + l[i] + q + ' , );, " for(int i = 10, i <= 18, i++)", " System . out . println ( l [ i ] );", " }", "}", }; 위해서(인트 i = 2; i <=> 9; i++) 시스템..나가..인쇄(l[i]); 위해서(인트 i = 0; i < > l.길이; i++) 시스템..나가..인쇄( l[0] + q + l[i] + q + ',' ); 위해서(인트 i = 10; i <=> 18; i++) 시스템..나가..인쇄(l[i]); } }
이러한 프로그램은 다양한 사이클 길이로 제작되었습니다.
- Haskell → Python → Ruby[7]
- Python → Bash → Perl[8]
- C → Haskell → Python → Perl[9]
- Haskell → Perl → Python → Ruby → C → Java[10]
- 루비 → Java → C[11]# → Python
- C → C++ → Ruby → Python → PHP → Perl[12]
- 루비 → Python → Perl → Lua → OCaml → Haskell → C → Java → Brainfuck → Whitespace → Unlambda[13]
- Ruby → Scala → Scheme → Scilab → Shell (표준) → S-Lang → Smalltalk → Squir3 → Standard ML → ...→ Rexx(128개([14]이전에는 50개) 프로그래밍 언어)
- 웹 어플리케이션 → C (웹 어플리케이션 소스코드는 HTML, JavaScript,[15] CSS로 구성됩니다)
멀티쿼인
Unlambda의 창시자인 David Madore는 멀티쿼인을 다음과 [16]같이 설명합니다.
「멀티 쿼인은, 전달되는 커맨드 라인 인수에 따라서, 각각 임의의 r 프로그램(자체 포함)을 인쇄할 수 있는, r개의 다른 언어의 프로그램 세트입니다(이 조건 없이, 모두 1개의 쿼인과 같게 할 수 있습니다).(부정행은 허용되지 않습니다.명령줄 인수는 너무 길지 않아야 합니다.프로그램의 전문을 전달하는 것은 부정행위로 간주됩니다)."
2개의 언어(또는 비퀸)로 구성된 복수 쿼인은 다음과 같은 프로그램입니다.
- 실행 시 는 언어 X의 Quine입니다.
- 사용자 정의 명령줄 인수와 함께 제공된 경우 언어 Y로 된 두 번째 프로그램을 인쇄합니다.
- 언어 Y의 두 번째 프로그램이 정상적으로 실행되면 언어 Y의 quine도 됩니다.
- 언어 Y의 두 번째 프로그램이 주어지고 사용자 정의 명령줄 인수가 제공되면 원래 프로그램은 언어 X로 생성됩니다.
그러면 바이퀸은 제공된 명령줄 인수에 따라 두 프로그램 중 하나를 인쇄할 수 있는 두 프로그램의 세트로 볼 수 있습니다.
이론적으로는 복수 쿼인의 언어 수에 제한이 없습니다.Python, Perl, C, NewLISP 및 F#[17]에서 5부문의 멀티쿼인([18]또는 펜타킨)이 생성되었으며 25개 언어의 멀티쿼인도 있습니다.
방사선 경화
방사선 경화 quine은 단일 문자를 제거할 수 있으며 누락된 문자가 없는 원본 프로그램을 생성할 수 있는 quine입니다.필연적으로 이러한 quins는 일반 quins보다 훨씬 복잡합니다.[19]Ruby의 다음 예에서 볼 수 있습니다.
평가하다='eval$q=%q(%q(10210/)가 필요)#{1 1 한다면 1==21}}/.i rescue ##/ 1 1 13 13 , 213 . max _ by s . s . s . size } # " # # . . gsub ( / \ d / ) { [ " =\47eval$q=%q(#$q)#\47##\47 ",:eval,:val_", =9"][eval$$BODY$$amp;]} 종료)#'##' instance_eval='eval$q=%q(%q(10210/)가 필요)#{1 1 한다면 1==21}}/.i rescue ##/ 1 1 13 13 , 213 . max _ by s . s . s . size } # " # # . . gsub ( / \ d / ) { [ " =\47eval$q=%q(#$q)#\47##\47 ",:eval,:val_", =9"][eval$$BODY$$amp;]} 종료)#'##' /#{평가하다 평가하다 한다면 평가하다==instance_eval}}/.i 구조.##/ 평가하다 평가하다"[eval = 9,190_eval =9.max_by{ s.size}#"##"
「 」를 참조해 주세요.
메모들
레퍼런스
- ^ Bratley, Paul; Millo, Jean (1972). "Computer Recreations: Self-Reproducing Automata". Software: Practice and Experience. 2 (4): 397–400. doi:10.1002/spe.4380020411. S2CID 222194376.
- ^ Kuhn, Bradley M. (November 21, 2007). "stet and AGPLv3". Software Freedom Law Center. Archived from the original on March 15, 2008. Retrieved June 14, 2008.
- ^ http://wiki.c2.com/ ® Quine Program
- ^ "Simple Java quine, self replicating (Self copying) Java code, with text blocks. This code can be run with Java 15+ or Java 13+ with special flags. License is public domain, no rights reserved".
- ^ "IOCCC 1994 Worst Abuse of the Rules". Archived from the original on 12 November 2020.
- ^ "Makefile". IOCCC.org. Archived from the original on 23 April 2019. Retrieved 4 April 2019.
- ^ Dan Piponi (5 February 2008). "A Third Order Quine in Three Languages".
- ^ Bruce Ediger. "Ask and ye shall receive: Self-replicating program that goes through three generations, Python, Bash, Perl". Archived from the original on 2011-02-23. Retrieved 2011-03-17.
- ^ b.m. (1 February 2011). "multiquine". Archived from the original on 2013-04-15.
- ^ Dan Piponi (30 January 2011). "Quine Central".
- ^ Ruslan Ibragimov (20 April 2013). "Quine Ruby -> Java -> C# -> Python" (in Russian). Archived from the original on 4 March 2016. Retrieved 20 April 2013.
- ^ Shinichiro Hamaji (10 November 2007). "Quine by shinh (C C++ Ruby Python PHP Perl)". (이것도 폴리글롯입니다)
- ^ Ku-ma-me (22 September 2009). "Uroboros Programming With 11 Programming Languages". Archived from the original on 29 August 2011. Retrieved 17 March 2011.
- ^ Yusuke Endoh (2 November 2021). "Quine Relay - An uroboros program with 100+ programming languages". GitHub.
- ^ Michael Wehar (10 November 2019). "C Prints JavaScript".
- ^ David Madore. "Quines (self-replicating programs)".
- ^ Rijnard van Tonder (14 January 2020). "Pentaquine - 5 part multiquine". GitHub.
- ^ Lu Wang (21 May 2021). "Quine Chameleon#Variants". GitHub.
- ^ Yusuke Endoh. "Radiation-hardened Quine". GitHub. Retrieved 2014-02-24.
추가 정보
- 더글라스 호프스타터: 괴델, 에셔, 바흐: 영원한 황금 땋은 머리
- Ken Thompson: "신뢰에 관한 고찰" (ACM 커뮤니케이션, 27(8):761-3)
외부 링크
- TiddlyWiki, 위키로 표현된 퀴인
- Quine Page (게리 P 지음)톰슨)
- 셀프 레퍼런스 프로그램 개요 가이드
- 포틀랜드 패턴 저장소 Wiki의 QuineProgram
- 데이비드 메이도르의 퀴인 토론
- Zip 파일 쿼리
- ZIP 파일 완전 다운
- Quines 입문 - 특히 여러 언어를 사용하는 Quines
- Quine Web Page: 자체 소스 코드를 표시하는 표준 준거 HTML+JavaScript 웹 페이지
- HTML Quine:HTML 및 CSS만을 사용하여 자체 소스 코드를 표시하는 HTML 페이지
- Quine Challenge for Tom's JavaScript Machine, 일련의 인터랙티브 힌트
- Kleene의 고정점 정리, 구성 및 s-n-m에서 직결된 Java Quine
- QR코드 quine