Quine di errore (o avviso) che è anche un quine regolare [chiuso]


9

(Ispirato da questo commento su una vecchia domanda.)

sfondo

Un errore quine (noto anche come "Kimian quine") è un programma che, una volta compilato o eseguito, fa sì che il compilatore / interprete / runtime stampi un messaggio di errore con testo identico al programma stesso e nient'altro. Ai fini di questa sfida, stiamo definendo "errore" in senso lato, per includere anche gli avvisi.

Compito

In questa sfida, stiamo cercando un che è anche un quine di errore. Una volta eseguito, il programma deve stampare normalmente il proprio codice sorgente (cioè non come un messaggio di errore / avviso); questo deve essere un vero quine (cioè una parte del programma deve codificare una parte diversa dell'output). Inoltre, la compilazione e l'esecuzione del programma devono anche causare l'implementazione del codice sorgente del programma, e nient'altro, come messaggi di errore o di avviso. (Si noti che ciò significa che non sarà possibile utilizzare errori di compilazione, nelle lingue in cui questi impediscono l'esecuzione normale del programma.) In altre parole, il codice sorgente del programma verrà stampato due volte, una volta tramite ciascun metodo.

chiarimenti

  • Nella maggior parte dei casi, sarà ovvio ciò che è e non è un messaggio di errore / avviso; non stiamo distinguendo tra i due qui. In casi ambigui, definire un messaggio di errore / avviso come qualsiasi testo emesso dall'implementazione: 1. come conseguenza di qualcosa di diverso dall'esecuzione di un comando (o qualunque sia l'equivalente più vicino nella lingua); o 2. che non faceva parte dell'input al comando che lo produceva come output.
  • La parte di errore / avviso del quine non deve necessariamente essere un quine corretto (anche se nella maggior parte dei casi lo sarà per caso, poiché la maggior parte dei messaggi di errore e di avviso contengono notevoli quantità di testo fisso).
  • È accettabile che il programma generi più errori / avvisi, che formano la fonte del programma quando vengono concatenati insieme. Non è accettabile generare errori / avvisi che non compaiono nella fonte.
  • A differenza di molte sfide, è probabile che le opzioni fornite al compilatore e al nome del file del programma siano altamente rilevanti in questa sfida. Dato che la sfida potrebbe non essere possibile altrimenti, sono disposto a essere flessibile qui, anche se se si esegue l'implementazione in modo insolito, ricordare che le regole PPCG addebitano una penalità di byte per farlo (pari al numero di caratteri aggiuntivi che dovresti aggiungere sulla riga di comando il modo "normale" più breve per eseguire un programma), quindi dovrai specificare la dimensione della penalità nel tuo post. (Ad esempio, se l'interprete in uso legge il programma da un file e non ha particolari restrizioni sul nome file, il modo normale più breve per eseguire il programma sarebbe da un file con un nome file di 1 carattere; quindi,
  • La versione del compilatore / interprete che usi potrebbe essere pertinente, quindi come parte del tuo invio, indica un compilatore o un interprete specifico su cui funziona il tuo programma e quale versione è richiesta. (Ad esempio, un invio C potrebbe indicare "C (gcc 6.2.0)" nell'intestazione.)
  • Si noti che questa attività potrebbe non essere possibile in tutte le lingue. Nelle lingue in cui si trova, il metodo più semplice sarà probabilmente quello di trovare un messaggio di errore o di avviso per il quale è possibile personalizzare alcuni sottoinsiemi del testo (cambiando il nome di qualcosa che viene citato nel messaggio; i nomi dei file sono una scelta comune qui, ma non l'unico). Sarò particolarmente colpito (e sorpreso) se qualcuno trova un modo per farlo usando solo messaggi di errore e di avviso il cui testo è stato corretto.

Condizione di vittoria

Questa è una sfida di , quindi una voce è considerata migliore se ha un numero di byte inferiore. Pertanto, una volta che il programma funziona, si desidera ottimizzarlo per ridurre il numero di byte il più possibile. (Tuttavia, non scoraggiarti se c'è già una voce più breve, soprattutto se è in una lingua diversa; quello che stiamo davvero cercando qui è abbreviare il più possibile un algoritmo o un'idea particolare dietro un programma, ma vedere più le soluzioni in diverse lingue o che si basano su principi diversi sono sempre utili.)


2
Come ho detto in chat, penso che il primo punto elenco non sia chiaro. Nella maggior parte dei casi, sarà ovvio ciò che è e non è un messaggio di errore / avviso serve solo come punto di partenza per discussioni e legalità linguistica.
Dennis,

@Dennis: concordo in linea di principio che la situazione non è eccezionale, ma d'altra parte non riesco a pensare a un modo concreto per migliorarla; rimuovere l'eccezione per cose che sono ovviamente messaggi di errore può portare ad alcune situazioni non intenzionali in alcune lingue, il che potrebbe causare più danni di quanti ne guarisca; se pensi di poter migliorare la domanda, non ho alcuna obiezione sulla sua modifica (e non penso davvero che le domande su PPCG debbano avere "proprietà" comunque, sebbene si

Così com'è, penso che la domanda non sia chiara e priva di un criterio oggettivo di validità. Concordo sul fatto che il mio cambiamento proposto potrebbe peggiorare le cose. Un possibile modo di agire sarebbe quello di mettere in attesa la sfida e ripubblicarla nella sandbox.
Dennis,

1
Per ora ho sospeso la sfida. Spero che tu abbia riconsiderato di ripubblicarlo nella sandbox. È un'idea molto interessante e sarebbe un peccato lasciarla andare.
Dennis,

1
Il post sulla sandbox è qui . (Stavo considerando di modificarlo nella domanda, ma ciò avrebbe messo il post nella coda di riapertura, il che sarebbe altamente controproducente in quanto renderebbe più difficile riaprire se e quando i problemi fossero stati risolti.)

Risposte:


9

JavaScript (Firefox 50), 153 byte

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

Spiegazione

L'idea qui era di iniziare con il quine JS più facilmente modificabile che ho trovato ancora:

".replace(/.+/,x=>alert(uneval(x)+x))".replace(/.+/,x=>alert(uneval(x)+x))

La throwparola chiave è un modo semplice per far lanciare anche il proprio codice:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

Tuttavia, c'è un piccolo problema: Firefox antepone il messaggio generato Error:. Fortunatamente, Error: mycodeè effettivamente valido JavaScript! (Per saperne di più, visita MDN .)

Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

Oops, questo avvisa la cosa sbagliata:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: 

Poiché le virgolette non sono più all'inizio del codice, uneval(x)+xnon ci darà il risultato corretto. Il modo migliore per risolvere questo problema è aggiungere un segnaposto al posto della stringa nidificata:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})

Uh-oh, ora c'è un extra Error:nel messaggio di errore. Risolviamolo tagliando la stringa:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

E infine, sia l'output che il messaggio di errore sono identici al codice! Aggiungerei uno snippet di stack, ma non sembra funzionare in uno snippet in nessun browser.


5

Python 2, 217 80 51 byte

È richiesto l'alimentatore finale.

s='s=%r;print s%%s;exit(s%%s)';print s%s;exit(s%s)

Provalo online

Ho iniziato con un semplice quine:

s='s=%r;print s%%s';print s%s

Poi ho aggiunto raisealla fine di lanciare un IOError.

s='s=%r;print s%%s;raise IOError(s%%s)';print s%s;raise IOError(s%s)

Sfortunatamente, il traceback stava causando problemi (non riuscivo a farlo sparire completamente), e il nome dell'eccezione veniva sempre stampato davanti come IOError: <code here>, anche se rimossi il traceback.

Quindi ho trovato questa utile risposta SO e l'ho modificata per i miei scopi.

Poi ho scoperto che posso saltare la creazione della mia classe e posso semplicemente usare sys.exit, rendendo il mio codice molto più breve.


1
Non penso che ciò sia conforme alla definizione di errore nelle specifiche della sfida poiché non è una conseguenza di qualcosa di diverso dall'esecuzione di un comando,faceva parte dell'input al comando che lo ha prodotto come output . Detto questo, exitqui funziona perfettamente. Non c'è bisogno di sys.
Dennis,

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.