Quining, mais avec des fichiers Windows!

9

Écrivez un quine, qui une fois exécuté, se crée dans le répertoire courant, dans un fichier source nommé lui-même. Nous utiliserons Windows pour cela, donc le nom de fichier (et donc quine) doit avoir les limitations suivantes:

  • Aucun de ces personnages \ / : ? * < > |
  • Moins de 211 255 caractères

Limites et hypothèses

  • Votre code doit être un programme complet (il va être exécuté après tout).

  • Pas de copie depuis le fichier source.

  • Vous pouvez supposer qu'il n'y a pas d'autre fichier avec votre Quine comme nom (car cela produirait Quine (1)).

  • Les erreurs sont autorisées (tant qu'elles n'entrent pas dans le code source

C'est le , le code le plus court en octets gagne!

Éditer

Peut-être que je n'étais pas clair, le fichier avec le nom du quine doit en fait contenir le quine. Ma faute.

Thunda
la source
Quelles sont les limitations des caractères non ASCII dans le programme? (Sous Windows, cela peut très probablement dépendre de la version linguistique de Windows installée; j'oublie les règles exactes et si elles ont changé au fil du temps.)
Pourquoi moins de 211 octets? C'est une sorte de restriction arbitraire ...
mbomb007
@ mbomb007 Taille maximale du nom de fichier, je crois.
Addison Crump
1
@VoteToClose It's 255. stackoverflow.com/a/265782/2415524
mbomb007
@ mbomb007 Typo, peut-être?
Addison Crump

Réponses:

6

Vitsy, 10 27 octets

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

Si cela :était autorisé, je pourrais le raccourcir à 11 octets. :(

Explication:

'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".

Les deux piles seront identiques à la fin. Sur certaines versions de Java, cela peut générer un en FileNotFoundExceptionraison des différentes implémentations de la FileInputStreamclasse.

Réponse précédente avant modification:

&'rddd++}.

Explication:

&           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)

Parce que je pourrais aussi bien, voici un diagramme des étapes qui se produisent dans les piles (chaque pile est représentée par []):

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).

Je ne sais pas vraiment comment cela fonctionne correctement; des changements infimes provoquent une rupture. Par exemple, placer le &dans divers autres emplacements devrait tout aussi bien fonctionner, mais cela entraîne ClassCastExceptions, IOExceptions et ArrayOutOfBoundsExceptions selon l'endroit où vous le placez. Je devrais peut-être faire quelques corrections de bugs.

Addison Crump
la source
1
+1 pourPush a new stack to the stack stack.
Pavel
1
+1 de moi si vous pouvez pousser une nouvelle pile de piles vers une pile de piles de piles, sinon oubliez-la! ... Je plaisante +1, j'ai aussi ri.
Urne de poulpe magique le
2
@carusocomputing Et si je vous disais que je peux avec o? ;)
Addison Crump
Soupir décompressez ...
Urne de poulpe magique
1
Uhm ... Je pense que le fichier généré est censé contenir le code (c'est-à-dire que son contenu doit être égal à son nom de fichier)
Leo
5

Node.js, 56 52 octets

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

Ceci imprime l'avertissement

DeprecationWarning: L'appel d'une fonction asynchrone sans rappel est déconseillé.

Si vous voulez que le tout-vert, il en coûte 4 octets au changement writeFilede writeFileSync.

Patrick Roberts
la source
2

Lua, 96 octets.

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)

Tapé ceci sur mon téléphone, ça devrait marcher, mais je vais le tester quand j'arriverai à un ordinateur.

ATaco
la source
12
Je pense à tout le moins vous aurez besoin de changer sting.formatà string.formatdeux fois.
Peter Taylor
@PeterTaylor vous n'aimez pas Sting, n'est-ce pas?
KeyWeeUsr
5
@KeyWeeUsr, je n'ai rien contre lui personnellement, et en fait, il a aidé à payer mon éducation, mais je pense que la bibliothèque standard Lua a probablement été conçue pour une utilisation générale par des personnes familières avec des API similaires plutôt que spécifiquement pour les fans de Police.
Peter Taylor
1

C, 134 octets

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);}
MD XF
la source
La source ici contient *donc il ne semble pas que ce soit autorisé selon les règles.
Value Ink
@ValueInk Fixed. Merci d'avoir fait remarquer cela!
MD XF