Quining, ma con file Windows!


9

Scrivi un quine, che una volta eseguito, si crea nella directory corrente, in un file sorgente chiamato stesso. Useremo Windows in questo, quindi il nome del file (e quindi quine) deve avere le seguenti limitazioni:

  • Nessuno di questi personaggi \ / : ? * < > |
  • Meno di 211 255 caratteri

Limitazioni e ipotesi

  • Il tuo codice deve essere un programma completo (Dopo tutto verrà eseguito).

  • Nessuna copia dal file di origine.

  • Puoi presumere che non ci sia un altro file con il tuo Quine come nome (poiché produrrebbe Quine (1)).

  • Gli errori sono consentiti (purché non entrino nel codice sorgente

Questo è , vince il codice più corto in byte!

modificare

Forse non ero chiaro, il file con il nome del quine deve contenere effettivamente il quine. Colpa mia.


Quali sono le limitazioni sui caratteri non ASCII nel programma? (Su Windows, questo potrebbe probabilmente dipendere dalla lingua della versione di Windows installata; dimentico le regole esatte e se sono cambiate nel tempo.)

Perché meno di 211 byte? È una specie di restrizione arbitraria ...
mbomb007,

@ mbomb007 Dimensione massima del nome file, credo.
Addison Crump


@ mbomb007 Typo, forse?
Addison Crump,

Risposte:


6

Vitsy, 10 27 byte

'rddd++&"rdd8++a[v}v1-D);].

Se :fosse permesso, potrei accorciarlo a 11 byte. :(

Spiegazione:

'rddd++&"rdd8++a[v}v1-D);].
'                           Capture all instructions as a string until encountering
                              ' again, looping if necessary.
 r                          Reverse the current stack (output is top-down).
  ddd++                     Push char literal ' to the stack.
       &                    Push a new stack to the stack stack.
        "                   Same as ', but " specific.
         r                  Reverse the current stack.
          dd8++             Push char literal " to the stack.
               a            Push 10 to the stack.
                [        ]  Loop forever.
                 v          Capture the top value as a variable.
                  }         Take the bottom item of the stack and put it on the top.
                   v        Dump the variable to the stack.
                    1-      Subtract 1.
                      D     Duplicate the top item.
                       );   Pop n; if n is 0, exit the loop.
               a[v v1-D);]  This is a makeshift for loop with 10 iterations.
                          . Pop the top stack as n, and the second stack as o. 
                              Write a file called "n" with the contents of "o".

Le due pile saranno identiche alla fine. In alcune versioni di Java, ciò potrebbe essere FileNotFoundExceptiondovuto a diverse implementazioni della FileInputStreamclasse.

Risposta precedente prima della modifica:

&'rddd++}.

Spiegazione:

&           Push a new stack to the stack stack.
 'rddd++    Modified standard quine.
        }   Move the ' to the right place.
         .  Pop the top stack as n, and the second stack as o. Write a file called
                 "n" with the contents of "o". (Quine name, no content)

Perché potrei anche, ecco un diagramma dei passaggi che si verificano all'interno delle pile (ogni pila è rappresentata da []):

Initial state: [[]]

&              [[], []]
                  Push a new stack to the stack stack.

 '             [[], ["r", "d", "d", "d", "+", "+", "}", ".", "&"]]
                  This stack state occurs because ' will loop around the line
                    until finding the next '.

  r            [[], ["&", ".", "}", "+", "+", "d", "d", "d", "r"]]
                  Reverses the top (last) stack.

   ddd         [[], ["&", ".", "}", "+", "+", "d", "d", "d", "r", 13, 13, 13]
                  Push thirteen thrice.

      ++       [[], ["&", ".", "}", "+", "+", "d", "d", "d", "r", "'"]
                  Because char ' is 39 = 13 + 13 + 13.

        }      [[], [".", "}", "+", "+", "d", "d", "d", "r", "'", "&"]]
                  Takes the bottom item, then puts it on the top.

         .     []
                  Writes a file with content from the second-to-top stack and the
                    name as the concatenation of all elements in the top stack,
                    with top member priority (backwards from my representation).

In realtà non sono sicuro di come funzioni correttamente; piccoli cambiamenti causano la rottura di questo. Ad esempio, posizionarlo &in varie altre posizioni dovrebbe funzionare altrettanto bene, ma causa ClassCastExceptions, IOExceptions e ArrayOutOfBoundsExceptions a seconda di dove lo metti. Potrei aver bisogno di correggere alcuni bug.


1
+1 perPush a new stack to the stack stack.
Pavel

1
+1 da me se puoi spingere un nuovo stack in uno stack stack, altrimenti dimenticalo! ... scherzando +1, ho riso anche io.
Magic Octopus Urn

2
@carusocomputing E se ti dicessi che posso farlo o? ;)
Addison Crump

Sospiro decomprimere ...
Magic Octopus Urn

1
Uhm ... Penso che il file generato dovrebbe contenere il codice (cioè il suo contenuto dovrebbe essere uguale al suo nome file)
Leo

5

Node.js, 56 52 byte

function f(){require('fs').writeFile(f+='f()',f)}f()

Questo stampa l'avviso

DeprecationWarning: la chiamata di una funzione asincrona senza callback è obsoleta.

Se si desidera che il tutto-verde, che costa 4 byte ai cambiamenti writeFilea writeFileSync.


2

Lua, 96 byte.

s="s=%qs=string.format(s,s)f=io.open(s)f.write(f,s)"s=string.format(s,s)f=io.open(s)f.write(f,s)

Digitato questo sul mio telefono, dovrebbe funzionare, ma lo proverò quando arrivo a un computer.


12
Credo che per lo meno avrete bisogno di cambiamento sting.formatper string.formatdue volte.
Peter Taylor,

@PeterTaylor non ti piace Sting, vero?
KeyWeeUsr

5
@KeyWeeUsr, non ho nulla contro di lui personalmente, e in effetti mi ha aiutato a pagare per la mia educazione, ma penso che la libreria standard Lua sia stata probabilmente progettata per l'usabilità generale da persone che hanno familiarità con API simili piuttosto che specificamente per i fan della polizia.
Peter Taylor,

1

C, 134 byte

s[255];fd;char p[255]="s[255];fd;char p[255]=%c%s%c;main(){sprintf(s,p,34,p,34);creat(s,0);}";main(){sprintf(s,p,34,p,34);creat(s,0);}

La fonte qui contiene *quindi non sembra che sia consentito secondo le regole.
Value Ink,

@ValueInk Risolto. Grazie per la segnalazione!
MD XF,
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.