Preventivi sicuri per le quotazioni


17

Il tuo compito è semplice: scrivi un programma (o funzione) che non accetta input e restituisce (o restituisce) il suo codice sorgente. Il problema è che quando il programma è racchiuso "quotes"(carattere Unicode 34), dovrebbe di nuovo emettere il suo codice sorgente (ora citato).

Si applicano le regole standard per i quines. Questo è , quindi vince il programma più breve (in byte).


8
@ATaco pensa in modo creativo. Il codice tra virgolette normalmente non viene eseguito, ma quando l'intero programma è racchiuso tra virgolette vengono eseguite quelle sezioni .
Pavel,

1
Hmm, buon punto.
ATaco,

Questo potrebbe funzionare con BF su implementazioni che supportano !...
Esolanging Fruit il

1
Devi usare "? Alcune lingue supportano due o tre caratteri di citazione.
Neil,

1
@tkellehe Meta: cosa conta come un vero quine? Per quanto ho capito il tuo quine da 1 byte, viola il requisito di codice / dati formulato nel post più votato.
Laikoni,

Risposte:


4

Noodel , 9 7 byte

Questa versione funziona allo stesso modo dell'altra, solo che ho dimenticato che Noodel ha un modo per eseguire un blocco di codice una volta e ho creato la lingua ...

Ḷ1ḥ-Ð1ḥ@€

ḷḥ-Ðḥ@ḅ

Provalo:)


Come funziona

ḷḥ-Ðḥ@ḅ # Single statement that builds itself as a string.
ḷ       # Loop the following block of code unconditionally.
 ḥ-     # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
   Ð    # Push the stack as an array to stdout (since is an array it is done by reference).
    ḥ@  # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
      ḅ # Break out of the given loop. (The stack is now ["ḷ", "ḥ-Ðḥ@ḅ"]).

        # The top of the stack is popped off and displayed which modifies the array to produce {["ḷ"], "ḥ-Ðḥ@ḅ"} in stdout.

Quote-sicurezza

Posizionare il "personaggio prima e dopo il programma funziona perché Noodel ha una serie di personaggi dedicati a ciò che chiamo stampabili . Questi vengono immediatamente analizzati come letterali stringa quando posizionati da soli e consentono di stampare facilmente qualcosa sullo schermo. Quindi, a differenza della maggior parte delle lingue, Noodel vede il normale set ASCII che è considerato degno di stampa come letterali di stringhe dirette (tranne per lo spazio e l'alimentazione di riga) in cui la citazione del codice è semplicemente vista come una spinta sulle stringhe.

"ḷḥ-Ðḥ@ḅ"

"         # Pushes on the string literal "\"" onto the stack.

 ḷḥ-Ðḥ@ḅ  # Same execution as before, simply builds the Quine for this loop.
 ḷ        # Loop the following block of code unconditionally.
  ḥ-      # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
    Ð     # Push the stack as an array to stdout (since is an array it is done by reference).
     ḥ@   # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
       ḅ  # Break out of the given loop. (The stack is now ["\"", "ḷ", "ḥ-Ðḥ@ḅ"]).

        " # Pushes on the string literal "\"" onto the stack.

          # The top of the stack is popped off and displayed which modifies the array to produce {["\"", "ḷ", "ḥ-Ðḥ@ḅ"], "\""} in stdout.

"Provalo:)"


Frammenti

<div id="noodel" code='ḷḥ-Ðḥ@ḅ' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


<div id="noodel" code='"ḷḥ-Ðḥ@ḅ"' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


Non credo che l'uso esia valido. La domanda non richiede il carattere codificato come byte 34, ma il carattere Unicode 34. Non importa quale codifica usi, ce n'è solo uno:"
Dennis

@Dennis, immagino che tu stia dicendo che il riferimento al personaggio Unicode 34 era solo per garantire che tutti usassero lo stesso "? (Mi dispiace, sto solo cercando di assicurarmi di capire cosa stai dicendo) Inoltre, dovrei rimuovere tutto il testo nella risposta che si riferisce all'utilizzo e?
tkellehe,

1
Sì, ci sono migliaia di codifiche, ma solo un set di caratteri Unicode. Dato che "funziona, rimuoverei semplicemente la discussione e la utilizzerei semplicemente ".
Dennis,

11

Python 2 3, 181 152 130 124 122 byte

""" """>" "or exec("oct=0");p='"""" """>" "or exec("oct=0");p=%r;a=oct==0;print(p[a:~a]%%p)#".';a=oct==0;print(p[a:~a]%p)#

Provalo online! Il TIO viene fornito con un'intestazione e un piè di pagina che testano automaticamente la validità del quine. Puoi cancellarli per eseguire il quine.

Questo codice funziona utilizzando le stringhe a tre virgolette in Python. """ """è uguale a ' 'ed """" """è uguale a '" '.

Il codice utilizza exec, ma non per il modo "non scadente" di eseguire i dati come codice, solo per impostare una variabile all'interno di un'espressione. Ilexec codice è codificato correttamente nei dati.

La prima istruzione confronta la stringa, possibilmente con una citazione anteposta " ", e imposta la variabile di octconseguenza. (La variabile avrebbe potuto essere qualsiasi short builtin.)

Il resto del codice implementa quindi il tradizionale quine di Python usando %rla formattazione delle stringhe, con un po 'di codice aggiuntivo che rimuove le virgolette extra se octrimane invariato.

Una versione alternativa che utilizza "cheaty" execarriva a 126 byte con codice meno ripetuto:

""" """>" "and exec("oct=0");s='"""" """>" "and exec("oct=0");s=%r;p=%r;exec(p)#".';p='a=oct!=0;print(s[a:~a]%(s,p))';exec(p)#

Provalo online!


7

StandardML , 182 176 108 byte

";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))

Versione non quotata : provalo su codingground.
Versione quotata: provalo su codingground.

Si noti che l'output è simile a questo

> val it = "{some string}" : string
> val it = "{some string}" : string
{output to stdout}> val it = fn : string -> unit

perché il codice viene interpretato dichiarazione per dichiarazione (ognuno ;termina una dichiarazione) e mostra il valore e il tipo di ogni dichiarazione.


sfondo

In SML c'è un quine del modulo <code>"<code in quotes>":

str(chr 34);(fn x=>print(x^it^x^it))"str(chr 34);(fn x=>print(x^it^x^it))" 

e uno nella forma "<code in quotes>"<code>:

";str(chr 34)^it;print(it^it)";str(chr 34)^it;print(it^it)

Entrambi si basano sul fatto che la <code>parte non contiene virgolette e può quindi essere quotata senza la necessità di sfuggire a qualsiasi cosa, i "necessari per produrre il quine sono dati dastr(chr 34) .

Si basano fortemente anche sull'identificatore implicito itche viene utilizzato quando non viene fornito un identificatore esplicito in una dichiarazione.

Nel primo quine si str(chr 34);lega italla stringa contenente ", fn x=>avvia una funzione anonima prendendo un argomento x, quindi concatena x^it^x^ite stampa la stringa risultante. Questa funzione anonima viene applicata direttamente a una stringa contenente il codice del programma, quindi la concatenazione x^it^x^itproduce <code>"<code>".

La seconda riga inizia con solo il codice del programma come stringa a ";str(chr 34)^it;print(it^it)";cui è associato it. Quindi str(chr 34)^it;concatena una citazione all'inizio della stringa e poiché non viene fornito alcun identificatore esplicito, la stringa risultante "<code>viene associata it. Infine print(it^it)concatena la stringa con se stessa cedendo "<code>"<code>che viene quindi stampata.


Spiegazione

Modifica: non più aggiornato con la versione da 108 byte, tuttavia è possibile capirlo anche dopo aver letto questa spiegazione.

Il quine sicuro di virgolette combina entrambi gli approcci di cui sopra ed è esso stesso della forma "<code>"<code>. Mettendolo di nuovo tra virgolette ""<code>"<code>", otteniamo una stringa vuota e poi una quinta dell'altra forma.

Ciò significa che al programma viene data la propria fonte nella forma "<code>dall'identificatore it, oppure itè giusta "e ci viene data la nostra fonte <code>come argomento e deve quindi essere una funzione che gestisce tale argomento.

(if size it>1then(print(it^it);fn _=>())else fn x=>print(it^it^x^it^x^it))

Per identificare in quale caso siamo, controlliamo se la dimensione di itè maggiore di 1. Altrimenti lo itè "e siamo nel secondo caso, quindi la elseparte restituisce una funzione anonima fn x=>print(it^it^x^it^x^it)che viene quindi chiamata perché è seguita da source come stringa . Nota il carattere iniziale it^it^necessario per la stringa vuota all'inizio del programma.

Se size itè maggiore di 1 siamo nella thenparte e ci esibiamo print(it^it), giusto? Non del tutto, perché ho trascurato di dirti che SML è fortemente tipizzato, il che significa che un condizionale if <cond> then <exp_1> else <exp_2>deve sempre avere lo stesso tipo, il che significa che le espressioni <exp_1>e <exp_2>devono avere lo stesso tipo. Conosciamo già il tipo di elseparte: una funzione anonima che prende una stringa e quindi chiama printha tipo string -> <return type of print>e printha tipo string -> unit( unitè in qualche modo simile ad voidaltre lingue), quindi il tipo risultante è di nuovostring -> unit .

Quindi, se la thenparte fosse proprio di print(it^it)tipo unit, avremmo un errore di mancata corrispondenza del tipo. E allora fn _=>print(it^it)? ( _è un jolly per un argomento che non viene utilizzato) Questa funzione anonima di per sé ha un tipo 'a -> unitdove 'asta per un tipo arbitrario, quindi nel contesto del nostro condizionale che impone un string -> unittipo che funzionerebbe. (La variabile type 'aviene istanziata con type string.) Tuttavia, in questo caso non stamperemmo nulla poiché la funzione anonima non viene mai chiamata! Ricorda, quando andiamo nella thenparte, il codice generale lo è "<code>"<code>, quindi la parte <code>restituisce una funzione ma, poiché nulla viene dopo di essa, non viene chiamata.

Invece usiamo un sequentialisation che ha la forma (<exp_1>; ...; <exp_n>)dove <exp_1>per <exp_n-1>può avere tipi arbitrari e il tipo di <exp_n>fornisce il tipo di tutta sequentialisation. Da un punto di vista funzionale i valori di <exp_1>to <exp_n-1>vengono semplicemente scartati, tuttavia SML supporta anche costrutti imperativi, quindi le espressioni possono avere effetti collaterali. In breve, prendiamo (print(it^it);print)come then-part, quindi prima stampando e poi restituendo la funzione printche ha il tipo corretto.


7

V , 27 , 23 byte

éPñi"éP241"qpá"lxx|xÿ

Provalo online!

Poiché questo contiene alcuni caratteri non stampabili, ecco una versione leggibile:

éPñi"éP<C-v>241<esc>"qpá"lxx|xÿ

ed ecco un hexdump:

00000000: e950 f169 22e9 5016 3234 311b 2271 70e1  .P.i".P.241."qp.
00000010: 226c 7878 7c78 ff                        "lxx|x.

Quindi la prima cosa che dobbiamo fare è determinare se il primo personaggio è una citazione. éPinserisce un carattere "P", ma "éPè un NOOP. Successivamente, eseguiamo una leggera modifica sul quine estensibile standard, che è:

ñi<C-v>241<esc>"qpÿ

Lo faremo però in modo leggermente diverso. Prima di tutto dobbiamo inserire il testo iniziale "éP". Quindi lo facciamo

ñ                        " Start recording into register 'q'
 i                       " Enter insert mode
  "éP<C-v>241<esc>       " Enter the following text: '"éPñ'
                  "qp    " Paste the text in register 'q'
                     á"  " Append a '"'

Qui è dove avviene la ramificazione. Il testo attualmente nel buffer è

"éPñi"éP<C-v>241<esc>"qpá"P
Cursor is here ----------^

A meno che non l'abbiamo racchiuso tra virgolette, in quel caso la 'P' non sarebbe mai stata inserita e il buffer è:

"éPñi"éP<C-v>241<esc>"qpá"
Cursor is here ----------^

Dato che stiamo ancora registrando, possiamo fare quello che vogliamo qui, e verrà aggiunto al buffer quando ciò "qpaccade. Quindi da qui è abbastanza facile eliminare condizionalmente le virgolette:

l           " Move one character to the right. If there is no character to the right, 
            " then this is effectively a "break" statement, stopping playback of the recording
 xx         " Delete two characters (the '"P')
   |        " Move to the first character on this line
    x       " Delete one character
     ÿ      " End the program

3

JavaScript (ES6), 239 237 byte

Set=``;eval(";a='Set=``;eval(~;a=1;S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);~)';S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);")

Fai attenzione a provare ogni versione in un nuovo ambiente (ad esempio, una nuova scheda del browser)

Deve esserci almeno un modo per semplificare questo ...


1
Suppongo che potresti usare un array per i sostituti in questo modo: [x = "sostituisci"]. Potrebbe spezzare le cose però, non ho molta esperienza con le quines ...
Luca
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.