4P.a+80pa2*&wdt,kd&w74*,.ok@
オンラインでお試しください!
印刷できない文字は0x18です。
説明
通常の"
ベースのFungeoid quinesの問題は、ソースコード全体を繰り返す"
と、さらに追加され、文字列がソースコード全体をカバーしなくなることです。そのため、既存の回答ではチートg
アプローチが使用されています。
この回答では- "
ベースのアプローチを使用しています"
が、ソースにaを含める代わりに、実行時にプログラムに書き込みます。そう"
すれば、プログラムが繰り返される頻度に関係なく1つしか存在しません(プログラムのサイズに関係なく、特定の1つの座標にのみ書き込むためです)。
一般的な考え方は、スタック上にソースコード全体の表現を作成しますが、コードのサイズによって決定されるループの長さで文字の最初の29(プログラムの長さ)だけを循環させることです。したがって、実際に任意の文字(改行を除く)を後に追加することができ@
、結果は常にソースより1文字長いコアプログラムの周期的な繰り返しになります。
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.