Alice , 29 Bytes
4P.a+80pa2*&wdt,kd&w74*,.ok@
Probieren Sie es online!
Das nicht druckbare Zeichen ist 0x18.
Erläuterung
Das "
Problem mit den üblichen Fungeoid-Quines ist, dass wenn wir den gesamten Quellcode wiederholen, wir auch zusätzliche bekommen "
und die Zeichenfolge nicht mehr den gesamten Quellcode abdeckt. Ich nehme an, deshalb wird in der vorhandenen Antwort g
stattdessen der Cheat-Y- Ansatz verwendet.
Diese Antwort verwendet den "
-basierten Ansatz, aber anstatt ein "
in die Quelle aufzunehmen, schreiben wir es zur Laufzeit in das Programm. Auf diese Weise wird es immer nur eine geben, "
unabhängig davon, wie oft das Programm wiederholt wird (da wir es unabhängig von der Programmgröße nur auf eine bestimmte Koordinate schreiben).
Die allgemeine Idee ist dann, dass wir eine Darstellung des gesamten Quellcodes auf dem Stapel erstellen, aber nur die ersten 29 der Zeichen (dh die Programmlänge) durchlaufen, wobei die Länge der Schleife durch die Größe des Codes bestimmt wird. Daher können wir tatsächlich beliebige Zeichen (außer Zeilenvorschübe) anhängen, @
und das Ergebnis ist immer eine zyklische Wiederholung des Kernprogramms, ein Zeichen länger als die Quelle.
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.