실행될 때 P1보다 정확히 1 바이트 더 긴 동일한 언어의 다른 프로그램 P2를 출력하는 프로그램 (또는 함수) (P1이라고 함)을 작성하십시오.
프로그램 P2가 실행될 때 P2보다 1 바이트 긴 세 번째 프로그램 P3을 출력해야합니다. P3은 P3보다 1 바이트 더 긴 프로그램 P4를 출력해야합니다. P5, P6, …, P∞와 동일합니다.
프로그램 체인은 무기한 또는 통역사가 더 이상 처리 할 수없는 장소로 이동해야합니다 (그러나 언어 적으로 이론적으로 유효한 프로그램으로 유지되어야 함)
규칙
- 금지 된 표준 허점
- 체인의 모든 프로그램은 한 언어로되어 있어야합니다
- 입력이 없습니다. 출력이 stdout 또는 함수 반환 값으로 이동
- 일정 기간이 지나면 프로그램이 종료되어야합니다. 특정 시간대 이후에 출력 생성을 중지하지만 종료되지 않는 프로그램은 자격이 없습니다
각 언어에서 가장 짧은 프로그램 P1이 이깁니다!
답변
답변
ASCII 7 바이트, 4 바이트
1603
7은 일반적으로 ASCII로 인코딩되지 않지만 이번에는보다 편리한 인코딩이므로 3 비트가 아닌 각 실행마다 1 바이트를 추가합니다.
또한 이것이 부정 행위로 간주되는지 확실하지 않습니다. (여러 가지 방식으로 경계선을 가로 지르는 7 quine이 바람을 피우고 있는지 여부는 불분명합니다.) 0
인코딩 을하는 적절한 주장을 할 수 6
있지만 일반적으로 결과 문자가 어디에서 나오는지 확실하지 않습니다. “는 7 개에 매우 기괴하고 암묵적인 행동이 많기 때문입니다.
이 프로그램은 1
추가 된 상태로 인쇄 되며 여러 개의을 추가하더라도 그렇게 1
합니다. 주석 처리 된 디버그 추적은 160311
다음 과 같습니다.
|| 160311 Initial data ||; initial program 160311
||7 60311 1 command = append 7 to data
|1 0311 6 command = escape from the last | onwards (7 escapes to 1)
|16e77 0311 commands = append 6e77 to data
|16e77 16e77 Implicit (program is empty): copy data past last | to program
|16e777 6e77 1 command = append 7 to data
71603111 e77 6 command = escape from the last | onwards
71603111 e77 e7 command = output in same encoding as the source
( |
프로그램에 남은 것이 없으므로 e
프로그램을 부작용으로 즉시 종료합니다. 즉, 최종 7
프로그램이 실행되지 않습니다).
모든 문자가 어디에서 오는지에 대한 기본적인 혼란은 7의 대부분의 명령이 실행될 때 데이터를 6
생성 한 다음 주어진 데이터 조각을 생성하는 일련의 명령을 재구성하려고 시도한다는 것입니다. 이것은 종종 원본에 가깝지만 동일하지는 않습니다. quining 목적을 위해 일반적으로 결과가 거의 동일하고 일반적으로 선행 또는 후행과 다른 방식으로 7 프로그램을 작성합니다 7
. 예를 들어 1
데이터 716
에서는 가장 쉬운 방법입니다 1
현재 데이터 문자열로. 우리는 원래 16
다른 (그러나 비슷한) 문자 시퀀스로 그것을 생성하여 파괴적으로|
데이터가 시작된 마커. (나는 이것이 문자 그대로의 quine이 아니라는 가장 좋은 주장은 출력이 입력과 다르다는 것입니다!)
답변
하스켈 , 74 66 바이트
편집하다:
- -2 이용하여 바이트 H.PWiz
<>
후, -6을 이동(10*)<$>
.
이제 새로 무료 <>
연산자를 사용합니다 ( Semigroup
곱셈, 가져 오기없이 작동하려면 GHC 8.4 필요).
main=putStr$fst<>show$(10*)<$>("main=putStr$fst<>show$(10*)<$>",1)
온라인으로 사용해보십시오! (TIO에 아직 GHC 8.4가 없기 때문에 가져 오기로 치트합니다.)
작동 원리
main=putStr$
다음 문자열 값을 출력하는 상용구입니다.-
fst<>show
튜플을 가져 오는 함수이며 튜플의 문자열 표현과 연결된 튜플의 첫 번째 요소로 구성된 문자열을 반환합니다. 즉(fst<>show)(s,t) = fst(s,t)<>show(s,t) = s++show(s,t)
-
(10*)<$>
다음 튜플 의 마지막 요소에 10을 곱하여 숫자0
를 문자열 표현에 추가합니다 .
답변
C (gcc) , 134132 바이트
표준 C quine의 약간의 재 작업. 엄청나게 길다.
x;*s="x;*s=%c%s%c;main(i){for(i=__LINE__;i--;puts(&x));printf(s,34,s,34);}";main(i){for(i=__LINE__;i--;puts(&x));printf(s,34,s,34);}