Un quine su ogni linea


30

Il tuo obiettivo è quello di creare un programma che si stampi indefinitamente, con una nuova riga dopo ognuno. Pertanto, se il tuo programma è a linea singola, verrebbe ripetuto su ogni riga dell'output.

Esempio

Programma:

A

Produzione:

A
A
A
...

Regole

  • Deve essere un programma completo, non uno snippet o una funzione.
  • Il programma dovrebbe essere ripetuto per sempre senza errori di overflow dello stack o di limite di ricorsione.
  • L'output è stdout o l'alternativa più vicina.
  • Nessun input di programma accettato.
  • Non sono consentite scappatoie standard, come l'apertura del file del programma o l'accesso a una risorsa esterna. I programmi vuoti non sono ammessi come scappatoia standard.
  • Se il codice del programma termina con una nuova riga finale, questa non conta come la nuova riga necessaria tra le righe e devi stamparne un'altra.
  • - Vince il codice più !

Il titolo sembra qualificato solo per i programmi a una riga?
Paŭlo Ebermann,

@ PaŭloEbermann Quindi leggi la descrizione del problema. È un titolo spiritoso perché fa rima. Ecco un esempio di un programma multilinea valido: codegolf.stackexchange.com/a/57985/34718 . Non puoi aspettarti di sapere tutto su una sfida leggendo solo il titolo.
mbomb007,

@ PaŭloEbermann È solo while(1)println(your_code);
Matthew Roh,

Risposte:


19

Fissione, 7 byte

'!+!NR"

Una modifica piuttosto semplice della quinta Fission più corta che ho trovato finora : sto semplicemente usando il non distruttivo !invece di Oe ho aggiunto un Nper newline.

Quindi, tutto sommato, ecco come funziona: il flusso di controllo inizia Rcon un atomo in corso. "attiva / disattiva la modalità stringa, il che significa tutto fino alla successiva "stampa: in questo caso '!+!NR. Ciò lascia la "e la nuova riga da stampare. '!imposta la massa dell'atomo su 33, la +incrementa su 34 (il codice carattere di ") e !stampa la citazione. Nstampa una nuova riga e Rin questo caso ora non è operativo, quindi il ciclo ricomincia.

La seguente soluzione a 7 byte funziona anche:

"NR'!+!

9

> <> , 16 byte

'ard3*o50l2)?.~~

Il tradizionale> <> quine usa troppi os, quindi usiamo un loop per la stampa. Prima di ogni salto spingiamo 5 e 0 (le coordinate di dove saltare), dopodiché saltiamo con .se c'è ancora qualcosa da stampare, o pop con i primi due valori ~~.

(Ripristinato alla versione 16 da quando ho dimenticato la regola di overflow dello stack.)


Un'alternativa è "ar00go50l2)?.[, giusto?
mbomb007,

3
@ mbomb007 Immagino, ma preferisco d3*dato che glegge il tuo codice sorgente
Sp3000

8

CJam, 13 byte

{_o"_g
"o1}_g

L'interprete online non stampa nulla prima che il programma sia terminato, quindi dovrai provarlo nell'interprete Java.

Spiegazione

Finalmente un quine CJam generalizzato che non finisce in _~.

{_o"_g
"o1}

Questo semplicemente spinge un blocco. _gduplica il blocco e lo esegue ripetutamente mentre la parte superiore della pila è vera (scartando la condizione).

Ora all'interno del blocco, l'altra copia del blocco è ancora in pila. Lo dupliciamo e lo stampiamo con _oe poi stampiamo _gseguito da una nuova riga (la nuova riga aggiuntiva necessaria tra le righe) con "_g\n"o. Alla fine, inseriamo una 1pila nello stack per ripetere il loop, perché purtroppo i blocchi non sono veritieri (o falsi) in CJam.


7

Python 2, 39

Non è un compito molto interessante in Python in quanto è banale aggiungere il ciclo while a un normale quine.

c='while 2:print"c=%r;exec c"%c';exec c

Questo non fa esplodere la pila?
Jesan Fafon,

1
@JesanFafon No, se lo provassi vedresti che non è così. Non c'è ricorsione.
feersum,

6

Perl 5.10+, 40 37 byte

$_=q{say"\$_=q{$_};eval"while 1};eval

o (anche 37 byte)

$_=q{{say"\$_=q{$_};eval";redo}};eval

Richiamare con il flag della riga di comando -M5.010o -E, ad es

$ perl -E '$_=q{say"\$_=q{$_};eval"while 1};eval'
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
...

Grazie a Ilmari Karonen per aver rasato 3 byte dalla mia soluzione originale, che era:

eval while$_=q{say"eval while\$_=q{$_}"}

Questa, così come le soluzioni a 37 byte più brevi sopra, sono tutte semplici varianti del seguente quine, che ho visto per la prima volta in uno degli altri post di Ilmari :

$_=q{say"\$_=q{$_};eval"};eval

Dal momento che tutto ciò che ho aggiunto nella mia soluzione originale era un whileciclo, merita davvero la maggior parte del merito. :-)


Bello, e grazie per il merito. :-) Il quine originale è il mio design, anche se qualcun altro potrebbe averlo scoperto in modo indipendente prima. A proposito, $_=q{say"\$_=q{$_};eval"while 1};evalo $_=q{{say"\$_=q{$_};eval";redo}};evalsarebbe più corto di qualche byte. ( $_=q{say"\$_=q{$_};eval";eval};evalsarebbe ancora più breve, ma sospetto che alla fine si esaurirà lo stack.)
Ilmari Karonen,

Speravo che ti fossi presentato! Grazie per le soluzioni più brevi, ho pensato che avresti trovato qualcosa di meglio; ma sono rimasto così colpito da questo quando l'ho visto nella risposta a cui mi sono collegato, ho dovuto provarlo da solo. :) Ad essere sincero, non ho ancora del tutto avvolto la testa intorno ai quines, ma le risposte aggiuntive mi danno più da vedere. Non ero sicuro che tu abbia avuto origine da questo perché ti ho visto accreditato con il Perl quine non cheat più corto di sempre (?!) in questa pagina , ma non c'è attribuzione per questo quine (usando printinvece di say).
ThisSuitIsBlackNon

tra l'altro, l'ultimo effettivamente segfault dopo aver funzionato per un po '. Grazie ancora, @Ilmari!
ThisSuitIsBlackNon

In realtà, lo riprendo un po 'indietro - sicuramente non sono il primo a inventare quel quine , e dal momento che l'avevo sicuramente visto prima (ho pubblicato quello per cui rivendico un certo credito nello stesso thread), è molto probabile che inconsciamente me lo ricordavo da quel filo o da qualche altra parte.
Ilmari Karonen,

Bene, ho lasciato l'origine non specificata. Indipendentemente da ciò, grazie per i 3 byte e grazie per l'ispirazione originale.
ThisSuitIsBlackNon

5

Brainf *** (SMBF) automodificante , 14 byte

La newline finale \ndeve essere letterale, Unix, newline (codice ASCII 10).

[<[<]>[.>]<.]\n

Spiegazione:

Il codice sposta il puntatore all'estrema sinistra del suo codice sorgente, quindi stampa tutto, inclusa la nuova riga (due volte in b / c della regola). Il ciclo continua.


Vuoi dire, deve essere \r?
Ismael Miguel,

@IsmaelMiguel No. \nè una nuova riga ed è il codice ASCII 10, quindi un dump esadecimale del codice sorgente avrebbe il valore 0Aper quel byte. code.cside.com/3rdpage/us/newLine.html
mbomb007

1
@IsmaelMiguel Non è vero. Quando si digita il codice, si preme effettivamente il tasto Invio per una nuova riga. \ngeneralmente conta come 2 caratteri e 2 byte nel tuo codice. L'ho digitato in questo modo per leggibilità, poiché la formattazione non funziona bene per mostrare una riga vuota alla fine del mio codice sorgente. E così ho dovuto specificare che era UN byte, non due.
mbomb007,

2
\nè sempre un singolo carattere, chiamato avanzamento riga . Una newline , tuttavia, è una sequenza di byte dipendente dalla piattaforma.
Dennis,

2
@Dennis Forse è così, ma non mi interessa. Non chiamo /"Solidus" e non conosco nessuno che lo sappia. "Newline" inizia con un n, e questo è il personaggio di escape, quindi è quello che io lo chiamo. È più vicino a "avanzamento riga" che a "ritorno a capo".
mbomb007,

3

PowerShell, 143 byte

$d='$d={0}{1}{0}{2}while(1){3}Write($d -f [char]39,$d,"`n",[char]123,[char]125){4}'
while(1){Write($d -f [char]39,$d,"`n",[char]123,[char]125)}

Basato sul quine di Rosetta Code PowerShell , sono abbastanza sicuro che questo non sia il più breve possibile. La formattazione di sostituzione delle stringhe in PowerShell è dannosa per questo, perché gli stessi delimitatori per dove inserire i rimpiazzi {}delimitano anche i blocchi di codice while{}, quindi dobbiamo usare il [char]cast, che gonfia il codice un mucchio.


3

Sottocarico, 25 byte

La prima volta che ho provato qualcosa del genere e non sono sicuro che segua tutte le regole in quanto è un paio di righe. La newline è stata un po 'dolorosa.

(::a~*S:a~*^
)::a~*S:a~*^

1
@ mbomb007 L'output per iterazione sono le due righe del programma. L'ho provato qui
MickyT

3

Befunge , 30 20 byte

<,+55,*2+98_ #!,#:<"

Una variante di un popolare befunge quine che stampa una nuova riga e fa apparire -1 in pila se termina la linea.
Sfortunatamente, Befunge diventa prolisso quando fa le cose in una riga. Ho provato a rimuovere tutti i launchpad ( #) che potevo, ma alcuni dovevano essere lasciati dentro per saltare alcuni comandi (come ,).

I cambiamenti:

30-20 -> ha cambiato il quine di base con uno personalizzato che ho creato usando l'input di stringhe. In questo modo, la ramificazione è molto più semplice.

Vecchio:

:0g,:93*`>0-10 #,+$#: #5 _1+>

Non penso che sia ottimale, ma per ora è accettabile.


Puoi usare un'istruzione get per afferrare uno spazio e aggiungerne 2 per un byte più corto di 98+2/: <, + 55, + 2g1_ #!, #: <"
MildlyMilquetoast

E prima spingi la citazione e la riga nuova e inverti la stampante,-1g0:+5<>:#,_1"
Jo King,


2

R, 34 byte

repeat{write(commandArgs()[5],'')}

per richiamare dalla riga di comando come segue:

Rscript -e "repeat{write(commandArgs()[5],'')}"

2

> <>, 31 29 byte

Una semplice modifica del tradizionale > <> quine .

"ar00gc0.0+efooooooooooooooo|

Per eseguirlo, incollalo qui , fai clic su "Invia", quindi su "Avvia" (l'esecuzione senza animazione non funziona). Sentiti libero di aumentare la velocità di esecuzione.


"ar00gc0.0+feooooooooooooooo|è due byte più breve.
Cole

@Cole Grazie. Avevo pensato allo specchio, ma avevo dimenticato di cambiarlo dopo essere stato messo da parte su una sfida diversa.
mbomb007,


@JoKing Esiste già una soluzione > <> più breve .
mbomb007,


2

GolfScript, 16 byte

{.".do
":n\p}.do

Questo finì per assomigliare molto alla voce CJam di Martin Büttner . Una caratteristica interessante è che, a quanto pare, il modo più breve per aggiungere ".do"al blocco quando è stampato è assegnarlo al terminatore di linea n. (Ovviamente, dobbiamo anche includere una nuova riga effettiva nella stringa, per sostituire quella nnormalmente contenuta.) La stessa stringa (essendo sincera in GolfScript) viene lasciata nello stack per dofar scattare il loop, assicurando che il loop corre per sempre.


1

BASH, 76 byte

Non ho potuto resistere, specialmente con PowerShell qui :)

while true;do
a ()
{
    echo while true\;do
    declare -f a
    echo a\;done
}
a;done

Lo spazio bianco è importante per una copia ESATTA.


1

Javascript (ES6), 64

for(;;(_=>console.log(`for(;;(_=>${arguments.callee})());`))());

In alternativa (anche 64)

a="for(;;)console.log(`a=${JSON.stringify(a)};eval(a)`)";eval(a)

L'alternativa non causerebbe un overflow dello stack?
Patrick Roberts,

No. Non c'è ricorsione, quindi non si dovrebbe aggiungere nulla in pila.
DankMemes,

Bene, ho appena provato entrambi, hai ragione sulla soluzione alternativa, ma la tua prima soluzione fallisce e ho capito perché. Secondo la documentazione MDN sulle funzioni della freccia , "Le funzioni della freccia non espongono un oggetto argomenti al loro codice", quindi il tuo arguments.calleenon esiste e genera un errore.
Patrick Roberts,

Interessante. Per me in Firefox Developer Edition 42.0a2 (2015-09-13), entrambi funzionano. Immagino che una volta che lo standard sarà pienamente adottato, il primo smetterà di funzionare.
DankMemes,

Li ho testati sull'ultimo Chrome poiché stavo cercando di golf la tua prima soluzione !invece di racchiudere le parentesi e mettere l'esecuzione della funzione dopo il ciclo for per evitare la necessità del corpo del punto e virgola ciclo che avrebbe salvato (credo) 4 byte
Patrick Roberts,

1

Microscript , 22 byte

"f1{CqxCanx"f1{CqxCanx

Sulla base della Quine dall'articolo Esolangs: "fCqxah"fCqxah. Sfrutta il fatto che la lingua aggiunge automaticamente le parentesi graffe di chiusura in base alle esigenze, senza le quali questo sarebbe più lungo di due byte.


1

Lotto, 10 (+ 4 per la lunghezza del nome file)

Non sono sicuro se questo si qualifica per due motivi:

  • Tecnicamente, potrebbero esserci o meno effetti collaterali testuali dalla shell dei comandi di Windows, poiché ciò dipende da come è configurato.
  • Questo programma si richiama per nome e non sono sicuro che sia proibito dalle regole (in particolare la regola "nessuna apertura del file di programma"). Non si sta aprendo allo scopo di leggere e stampare il testo; si sta semplicemente eseguendo nuovamente. Inoltre, la struttura del file system è parte integrante degli script batch della vecchia scuola (spesso utilizzati anche per memorizzare lo stato del programma, ecc.). Pertanto, non sono sicuro che ciò violi o meno la 5a regola.

Il codice (per un programma chiamato q.bat):

echo on&&q

2
Capisco che lo permetterò poiché non è il più corto, ed è creativo e unico. E non stava leggendo il codice sorgente, ma piuttosto eseguendo se stesso.
mbomb007,

1
Poiché il nome del file non è arbitrario, almeno è necessario aggiungere il nome del file al conteggio dei byte.
Martin Ender,

1
Credo che potresti usare echo on&&%0anche se ho paura di provarlo.
DankMemes,

1
Aggiornamento: echo on&&%0non funziona. %0viene visualizzato come espanso nell'output e windows (7, 32 bit, in esecuzione in una macchina virtuale) termina tutto abbastanza rapidamente.
DankMemes,

1
Penso che tu possa omettere la .batparte
SuperJedi224

1

Ceylon , 210 208 byte

Naturalmente questo non vincerà nulla ...

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

Originale:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

Ho modificato il mio Quine da due giorni fa aggiungendo il while(true){...}loop, quindi vengo dai 185 byte del semplice Quine a 210 (non ho più bisogno del carattere di nuova riga finale). Ma poi ho scoperto che un while(1<2){...}ciclo è anche più breve di due byte:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

(Ceylon non ha un for(;;)loop come Java, e anche le parentesi graffe sono necessarie per questo loop.)


1

PowerShell, 132 107 byte

$a='$a={0}{1}{0};for(){2}$a-f[char]39,$a,[char]123,[char]125{3}';for(){$a-f[char]39,$a,[char]123,[char]125}

Basato su Rosetta Quine (come su @AdmBorkBork) anche se non usa la formattazione per la sostituzione di stringhe ... forse passare a un ciclo for e usare la formattazione sarebbe meglio?

Sono sicuro che se AdmBorkBork tornasse, lo batterebbero molto: P

EDIT Capito il ciclo for e le sostituzioni, tutto grazie al mio predecessore :)

Vecchio tentativo:

$a='$a=;for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}';for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}


1

Java 10, 194 byte

interface M{static void main(String[]a){for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";;)System.out.println(s.format(s,34,s));}}

Spiegazione:

Provalo online (timeout dopo 60 sec).

interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";
                                //   Unformatted source code
        ;)                      //   Loop indefinitely
       System.out.println(      //    Print with trailing new-line:
         s.format(s,34,s));}}   //     The formatted source code

parte:

  • La stringa scontiene il codice sorgente non formattato.
  • %sè usato per inserire questa stringa in se stessa con s.format(...).
  • %c, %1$cE la 34vengono utilizzati per formattare le virgolette.
  • s.format(s,34,s) mette tutto insieme

Parte sfida:

  • for(;;) viene utilizzato per eseguire il ciclo indefinitamente.
  • System.out.println(...) è usato per stampare con la nuova riga finale





1

Brachylog , 16 byte

∋"∋~kgjẉ₁⊥"gjẉ₁⊥

Non puoi assolutamente provarlo online , ma ho verificato che funziona sulla mia installazione.

Brachylog , 18 byte

∋"∋~kgjw₁⊥~n"gjw₁⊥

Provalo online!

Adattato dalla versione alternativa di questo quine , con un hack di backtracking che avevo inizialmente ideato per il bogosort di tutte le cose. Spende due byte ~nperché (i soliti mezzi per stampare con una nuova riga finale) risolvono alcuni problemi strani con la codifica dei caratteri su TIO e una nuova riga effettiva inserita nella stringa letterale viene stampata ~kcome \n.

               w      Print
 "∋~kgjw₁⊥~n"         "∋~kgjw₁⊥~n"
∋                     which is an element of
                      the (unused and unconstrained) input
                ₁     formatted
          ~n          (so that the ~n is replaced with a newline)
             gj       with itself
   ~k                 (so that the ~k is replaced with the string in quotes),
                 ⊥    then try again.

Dato che w₁accetta l'input come un elenco [string to be formatted, formatting arguments], avvolgendo una stringa in un elenco e gconcatenandola a se stessa, jè possibile formattarla con se stessa. E poiché non viene fornito alcun input al programma, la variabile di input che è implicitamente presente all'inizio del programma può assumere qualsiasi valore, quindi può essere vincolata a una delle infinite liste che contengono "∋~kgjw₁⊥~n"come elemento, creando un singolo punto di scelta a cui tornare indietro quando dopo aver stampato la sua fonte il programma colpisce .


1

Python 3.6, 48 43 byte.

-5 byte grazie a @Jo King

x='while 1:print("x=%r;exec(x)"%x)';exec(x)

Puoi usare %rper salvare su come sfuggire a quei messaggi '. 43 byte
Jo King,

che dà 41 per Python 3.8: P
ASCII il

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.