Ihre Aufgabe ist einfach: Schreiben Sie ein Programm (oder eine Funktion), das keine Eingaben vornimmt und den Quellcode ausgibt (oder zurückgibt). Der Haken ist, dass wenn das Programm in "quotes"
(Unicode-Zeichen 34) eingeschlossen ist, es wieder seinen (jetzt zitierten) Quellcode ausgeben sollte.
Es gelten die Standardregeln für Quines. Das ist Code-Golf , also gewinnt das kürzeste Programm (in Bytes).
!
"
? Einige Sprachen unterstützen zwei oder drei Anführungszeichen.Antworten:
Nudel ,
97 BytesDiese Version funktioniert genauso wie die andere, nur dass ich vergessen habe, dass Noodel einen Codeblock einmal ausführen kann, und ich habe die Sprache ...
Ḷ1ḥ-Ð1ḥ@€
Versuch es:)
Wie es funktioniert
Zitat-Sicherheit
Das Platzieren des
"
Zeichens vor und nach dem Programm funktioniert, da Noodel eine Reihe von Zeichen hat, die dem gewidmet sind, was ich als Ausdrucke bezeichne . Diese werden sofort als String-Literale analysiert, wenn sie von selbst platziert werden, und ermöglichen es, einfach etwas auf den Bildschirm zu drucken. Im Gegensatz zu den meisten Sprachen sieht Noodel die normale ASCII- Menge, die als druckwürdig eingestuft wird, als direkte Zeichenfolgenliterale (mit Ausnahme von Leerzeichen und Zeilenvorschub), in denen der Code lediglich als Zeichenfolgen-Push betrachtet wird."Versuch es:)"
Schnipsel
quelle
e
gültig ist. Die Frage fragt nicht nach dem als Byte 34 codierten Zeichen, sondern nach dem Unicode-Zeichen 34. Egal welche Codierung Sie verwenden, es gibt nur eine:"
"
? (Entschuldigung, ich versuche nur sicherzustellen, dass ich verstehe, was Sie sagen.) Sollte ich auch den gesamten Text in der Antwort entfernen, der sich auf die Verwendung beziehte
?"
funktioniert, würde ich einfach die Diskussion entfernen und einfach nutzen"
.Python
23,181152130124122 BytesProbieren Sie es online! Das TIO wird mit einer Kopf- und Fußzeile geliefert, die automatisch die Gültigkeit des Quines überprüft. Sie können sie löschen, um nur das Quine auszuführen.
Dieser Code funktioniert unter Verwendung der dreifach in Anführungszeichen gesetzten Zeichenfolgen in Python.
""" """
ist gleich' '
und"""" """
ist gleich'" '
.Der Code verwendet
exec
, aber nicht für die "nicht quiney" Art der Ausführung von Daten als Code, nur zum Setzen einer Variablen innerhalb eines Ausdrucks. Dasexec
ist auch in den Daten richtig codiert.Die erste Anweisung vergleicht die Zeichenfolge, möglicherweise mit einem vorangestellten Anführungszeichen, mit
" "
und setzt die Variableoct
entsprechend. (Die Variable könnte eine beliebige Kurzvariable sein.)Der Rest des Codes implementiert dann das traditionelle Python-Quine unter Verwendung der
%r
Zeichenfolgenformatierung mit zusätzlichem Code, der die zusätzlichen Anführungszeichen entfernt, wenn eroct
unverändert bleibt.Eine alternative Version, die "cheaty" verwendet, enthält
exec
126 Bytes mit weniger wiederholtem Code:Probieren Sie es online!
quelle
StandardML ,
182 176108 BytesNicht zitierte Version: Probieren Sie es auf Codingground.
Zitierte Version: Probieren Sie es auf Codingground.
Beachten Sie, dass die Ausgabe ungefähr so aussieht
weil der Code deklarationsweise interpretiert wird (jede Deklaration
;
endet) und den Wert und den Typ jeder Deklaration anzeigt.Hintergrund
In SML gibt es eine Quine der Form
<code>"<code in quotes>"
:und eine in der Form
"<code in quotes>"<code>
:Beide stützen sich auf die Tatsache, dass der
<code>
-Teil keine Anführungszeichen enthält und somit ohne die Notwendigkeit, irgendetwas zu entgehen, zitiert werden kann, die"
zur Ausgabe des Quines erforderlich sind, gegeben durchstr(chr 34)
.Sie hängen auch stark von der impliziten Kennung ab,
it
die verwendet wird, wenn in einer Deklaration keine explizite Kennung angegeben ist.Im ersten
str(chr 34);
bindet quine anit
die Zeichenkette, die enthält"
,fn x=>
startet eine anonyme Funktion mit einem Argumentx
, verkettetx^it^x^it
und druckt die resultierende Zeichenkette. Diese anonyme Funktion wird direkt auf eine Zeichenfolge angewendet, die den Programmcode enthält, sodass sich die Verkettungx^it^x^it
ergibt<code>"<code>"
.Das zweite Quine beginnt nur mit dem Programmcode als String, an
";str(chr 34)^it;print(it^it)";
den gebunden wirdit
. Dannstr(chr 34)^it;
verkettet ein Zitat an den Anfang des Strings und als wieder keine explizite Kennung gegeben wird, den resultierenden String"<code>
ist gebundenit
. Schließlichprint(it^it)
verkettet die Zeichenfolge mit sich selbst ergibt ,"<code>"<code>
die dann gedruckt wird.Erläuterung
Bearbeiten: Mit der 108-Byte-Version nicht mehr auf dem neuesten Stand, aber man könnte es auch nach dem Lesen dieser Erklärung verstehen.
Die Quine, die für Anführungszeichen sicher ist, kombiniert beide oben genannten Ansätze und ist selbst von der Form
"<code>"<code>
. Wenn Sie dies erneut in Anführungszeichen setzen""<code>"<code>"
, erhalten Sie eine leere Zeichenfolge und dann eine Quine der anderen Form.Das heißt, das Programm erhält entweder eine eigene Quelle in Form
"<code>
des Bezeichnersit
, oder esit
ist gerecht"
und wir erhalten eine eigene Quelle<code>
als Argument und müssen daher eine Funktion sein, die mit einem solchen Argument umgeht.Um festzustellen, in welchem Fall wir uns befinden, prüfen wir, ob die Größe von
it
größer als 1 ist. Wenn nicht,it
ist dies"
der Fall, und wir befinden uns im zweiten Fall, sodass derelse
-Teil eine anonyme Funktion zurückgibtfn x=>print(it^it^x^it^x^it)
die dann aufgerufen wird, weil die Quelle als Zeichenfolge folgt . Beachten Sie denit^it^
Zeilenabstand, der zu Beginn des Programms für die leere Zeichenfolge benötigt wird.Wenn
size it
größer als 1 ist, sind wir imthen
-Part und führen einfach durchprint(it^it)
, oder? Nicht ganz, weil ich versäumt habe, Ihnen zu sagen, dass SML stark typisiert ist, was bedeutet, dass eine Bedingungif <cond> then <exp_1> else <exp_2>
immer den gleichen Typ haben muss, was wiederum bedeutet, dass die Ausdrücke<exp_1>
und<exp_2>
der gleiche Typ sein müssen. Wir kennen bereits den Typ deselse
Teils: Eine anonyme Funktion, die eine Zeichenfolge verwendet und dann aufruft,print
hat den Typstring -> <return type of print>
undprint
den Typstring -> unit
(unit
ist in gewisser Weise ähnlich wievoid
in anderen Sprachen), daher lautet der resultierende Typ erneutstring -> unit
.Wenn das
then
Teil also nurprint(it^it)
den Typ hatunit
, erhalten wir einen Typinkongruenzfehler. Also wie wäre esfn _=>print(it^it)
? (_
Ist ein Platzhalter für ein Argument , das nicht verwendet wird) Diese anonyme Funktion auf seine eigene Art hat ,'a -> unit
wo'a
für einen beliebigen Typ steht, so im Rahmen unserer bedingten , die eine erzwingtstring -> unit
Art dies funktionieren würde. (Die Variable type'a
wird mit type instanziiertstring
.) In diesem Fall würden wir jedoch nichts ausgeben, da die anonyme Funktion niemals aufgerufen wird! Denken Sie daran, wenn wir in denthen
-teil gehen, ist der Gesamtcode"<code>"<code>
, so dass der<code>
-teil zu einer Funktion ausgewertet wird, aber da nichts danach kommt, wird er nicht aufgerufen.Stattdessen wir eine Sequentialisierung verwenden , die die Form hat ,
(<exp_1>; ...; <exp_n>)
wo<exp_1>
auf<exp_n-1>
beliebige Arten und die Art kann von<exp_n>
der Art der ganzen Sequentialisierung bietet. Aus funktionaler Sicht werden die Werte von<exp_1>
to<exp_n-1>
einfach verworfen, SML unterstützt jedoch auch imperative Konstrukte, sodass die Ausdrücke möglicherweise Nebenwirkungen haben. Kurz gesagt, wir nehmen(print(it^it);print)
alsthen
-teil, also zuerst drucken und dann die Funktion zurückgeben,print
die den richtigen Typ hat.quelle
V ,
27, 23 BytesProbieren Sie es online!
Da dies einige nicht druckbare Zeichen enthält, ist hier eine lesbare Version:
Und hier ist ein Hexdump:
Das allererste, was wir tun müssen, ist festzustellen, ob das erste Zeichen ein Zitat ist.
éP
fügt ein 'P' ein, ist aber"éP
ein NOOP. Danach führen wir eine leichte Modifikation am ausziehbaren Standardquine durch, nämlich:Wir werden es allerdings etwas anders machen. Zuerst müssen wir den Starttext "éP" einfügen. So machen wir es
Hier findet die Verzweigung statt. Der aktuell im Puffer befindliche Text lautet
Wenn wir es nicht in Anführungszeichen setzen, wäre in diesem Fall das 'P' niemals eingefügt worden, und der Puffer lautet:
Da wir noch aufnehmen, können wir hier tun, was immer wir wollen, und es wird dem Puffer hinzugefügt, wenn das
"qp
passiert. Von hier aus ist es also ziemlich einfach, die Anführungszeichen bedingt zu löschen:quelle
JavaScript (ES6),
239 -237 ByteAchten Sie darauf, jede Version in einer neuen Umgebung (z. B. einem neuen Browser-Tab) zu testen.
Es muss mindestens einen Weg geben, dies zu vereinfachen ...
quelle