문제

Ken Thompson의 고전 논문 신뢰 신뢰에 대한 반성 에서 사용자에게 Quine 그의 주장에 대한 소개로 (강력히 읽기를 권장합니다). <인용구>

퀸은 입력을받지 않고 유일한 출력으로 자체 소스 코드의 사본을 생성하는 컴퓨터 프로그램입니다.

순진한 접근 방식은 다음과 같이 말하기 만하면됩니다. 라코 디스

그러나 이것이 불가능하다는 것을 금방 알 수 있습니다.결국 Python을 사용하여 직접 작성 했지만"트릭"을 설명하는 데 여전히 문제가 있습니다. Quines가 가능한 이유에 대한 훌륭한 설명을 찾고 있습니다.

도움이 되었습니까?

해결책

일반적인 트릭은 format-string이 프로그램의 구조를 나타내도록 printf를 사용하고 필요한 재귀를 얻기 위해 문자열 자체에 대한 자리 표시자를 사용하는 것입니다.

http://www.nyx.net/~gthompso/quine의 표준 C 예제.htm 이이를 잘 보여줍니다. 라코 디스

수정 :이 글을 작성한 후 약간의 검색을 수행했습니다. http://www.madore.org/~david/computers/quine.html 은 quines가 정확히 무엇이며 왜 작동하는지에 대한 매우 훌륭하고 이론적 인 설명을 제공합니다.

다른 팁

여기에 putchar 대신 printf를 사용하는 것이 있습니다. 따라서 모든 자체 이스케이프 코드를 처리해야합니다. 그러나 모든 C 실행 문자 세트에서 % 100 이식 가능합니다.

프로그램 텍스트 자체에 을 미러링하는 텍스트 표현에 이 있음을 볼 수 있습니다. 마지막 작업에. Quine을 작성하는 비결은이 "고비"를 극복하는 것입니다. 여기서 구멍을 나가는 방법으로 전환합니다. 옵션은 텍스트 표현과 언어의 출력 기능. 라코 디스 <시간>

일반적인 트릭은 텍스트 파일을 읽고 숫자 배열을 출력하는 프로그램을 작성하여 퀸을 점프 시작 하는 것입니다. 그런 다음 정적 배열을 사용하도록 수정하고 새 (정적 배열) 프로그램에 대해 첫 번째 프로그램을 실행하여 프로그램을 나타내는 숫자 배열을 생성합니다. 그것을 정적 배열에 삽입하고 안정 될 때까지 다시 실행하면 퀸이 생깁니다. 하지만 특정 문자 집합과 연결되어 있습니다 (== 100 % 이식성이 아님). 위와 같은 프로그램 (고전적인 printf 해킹이 아님)은 ASCII 또는 EBCDIC에서 동일하게 작동합니다 (고전적인 printf 해킹은 하드 코딩 된 ASCII를 포함하기 때문에 EBCDIC에서 실패합니다) ). <시간>

수정 :

질문을 다시주의 깊게 (마지막으로) 읽으면 실제로 기술보다는 철학을 더 많이 찾고있는 것 같습니다. 무한 회귀에서 벗어날 수있는 트릭은 two-fer 입니다. 동일한 데이터에서 인코딩 된 프로그램과 확장 된 프로그램을 모두 가져와야합니다. 동일한 데이터를 두 가지 방법으로 사용합니다. 따라서이 데이터는 향후 구현을 둘러싼 프로그램의 일부인 프레임 만을 설명합니다. 이 프레임 내의 이미지는 원본의 직선 사본입니다.

이것은 자연스럽게 손으로 재귀 적 그림을 만드는 방법입니다 : TV TV의 TV. 재귀가 충분히 확립 되었기 때문에 어느 시점에서 피곤하고 화면에 약간의 눈부심을 스케치합니다. <시간>

수정 : <인용구>

Quines가 가능한 이유에 대한 훌륭한 설명을 찾고 있습니다.

Quine의 "가능성"은 19 세기와 20 세기의 수학적 혁명의 깊이로 들어갑니다. W. V. O. Quine의 "클래식"퀸은 단어 시퀀스 (IIRC)입니다. <인용구>

자체에 추가되면 false를 반환합니다.

이것은 "슬플 때 나를 행복하게하고, 행복 할 때 나를 슬프게하는"무언가에 대한 David의 요청과 유사한 역설입니다. "이것도 지나갈 것입니다."라고 양쪽에 새겨진 메달이 대답했습니다.

동일한 종류의 매듭 은 Frege, Russell 및 Whitehead, Łukasiewicz, 그리고 물론 우리 소년 Turing, Church 및 Thue와 같은 현대 수학적 논리의 개척자들에 의해 조사되었습니다. Quine을 워드 플레이 영역에서 프로그래밍 데모로 전환 할 수있게하는 트릭은 ( 역설 부분을 풀면서) 산술을 인코딩하는 Gödel의 방법이었습니다. 연산 자체를 숫자로 표시하므로 전체 수학 표현식을 단일 (거대한) 정수로 인코딩 할 수 있습니다. 특히,이 표현의 디코딩을 수행하는 수학 함수는 동일한 (숫자) 형식으로 표현 될 수 있습니다. 이 숫자 (Gödel 인코딩 함수)는 코드와 데이터 모두 있습니다 .

이 power-trio (코드, 표현, 데이터)는 다른 표현으로 조옮김 할 수 있습니다. 다른 표현 (또는 바이트-> ASCII-> 16 진수-> 정수와 같은 체인 )을 선택하면 코드의 동작이 변경되어 데이터의 모양이 변경됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top