4P.a+80pa2*&wdt,kd&w74*,.ok@
Hãy thử trực tuyến!
Ký tự không thể in là 0x18.
Giải trình
Vấn đề với các "
câu lệnh Fungeoid dựa trên thông thường là nếu chúng ta lặp lại toàn bộ mã nguồn, thì chúng ta cũng nhận được bổ sung "
và chuỗi không còn bao gồm toàn bộ mã nguồn. Tôi cho rằng đó là lý do tại sao câu trả lời hiện có sử dụng g
phương pháp gian lận thay thế.
Câu trả lời này không sử dụng "
cách tiếp cận dựa trên, nhưng thay vì bao gồm một "
trong nguồn, chúng tôi viết nó vào chương trình khi chạy. Theo cách đó, sẽ chỉ có một lần "
bất kể chương trình được lặp lại thường xuyên như thế nào (vì chúng tôi chỉ ghi nó vào một tọa độ cụ thể, độc lập với quy mô chương trình).
Ý tưởng chung là sau đó chúng ta tạo ra một đại diện cho toàn bộ mã nguồn trên ngăn xếp, nhưng chỉ quay vòng qua 29 ký tự đầu tiên (tức là độ dài chương trình) với độ dài của vòng lặp được xác định bởi kích thước của mã. Do đó, chúng ta thực sự có thể nối các ký tự tùy ý (ngoại trừ nguồn cấp dữ liệu) sau @
và kết quả sẽ luôn là sự lặp lại theo chu kỳ của chương trình cốt lõi, dài hơn một ký tự so với nguồn.
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.