4P.a+80pa2*&wdt,kd&w74*,.ok@
온라인으로 사용해보십시오!
인쇄 할 수없는 문자는 0x18입니다.
설명
일반적인 "
Fungeoid quines의 문제점은 전체 소스 코드를 반복하면 추가 코드가 나오고 "
문자열이 더 이상 전체 소스 코드를 덮지 않는다는 것입니다. 이것이 기존 답변이 치트 g
접근법을 대신 사용하는 이유라고 생각합니다 .
이 답변은 "
기반 접근 방식을 사용 하지만 "
소스 에 포함하는 대신 런타임에 프로그램에 작성합니다. 그렇게 "
하면 프로그램이 얼마나 자주 반복되는지에 관계없이 하나만있을 것 입니다 (프로그램 크기와 관계없이 하나의 특정 좌표에만 쓰므로).
일반적인 아이디어는 스택에서 전체 소스 코드의 표현을 만들지 만 코드의 크기에 의해 결정된 루프의 길이와 함께 첫 29 개의 문자 (예 : 프로그램 길이) 만 순환한다는 것입니다. 따라서 실제로 임의의 문자 (줄 바꿈 제외)를 추가 할 수 @
있으며 결과는 항상 소스보다 한 문자 더 긴 코어 프로그램의 주기적 반복입니다.
4P Push 4! = 24. This is the code point of the unprintable, which we're
using as a placeholder for the quote.
.a+ Duplicate it and add 10, to get 34 = '"'.
80p Write '"' to cell (8,0), i.e. where the first unprintable is.
Placeholder, becomes " by the time we get here, and pushes the code
points of the entire program to the stack. However, since we're already
a good bit into the program, the order will be messed up: the bottom
of the stack starts at the 24 (the unprintable) followed by all
characters after it (including those from extraneous repetitions). Then
on top we have the characters that come in front of the `"`.
So if the initial program has structure AB, then any valid program has
the form ABC (where C is a cyclic repetition of the initial program),
and the stack ends up holding BCA. We don't care about C, except to
determine how big the program is. So the first thing we need to do is
bring B to the top, so that we've got the initial program on top of
the stack:
a2* Push 10*2 = 20.
&w Run the following section 21 times, which is the length of B.
dt, Pull up the value at the bottom of the stack.
k End of loop.
d&w Run the following section D+1 times, where D is the length of ABC.
74* Push 28, one less than the number of characters in AB.
, Pull up the 29th stack element, which is the next character to print.
.o Print a copy of that character.
k End of loop.
@ Terminate the program.