Quining, mas com arquivos do Windows!


9

Escreva um quine, que, quando executado, se cria no diretório atual, em um arquivo de origem com o nome próprio. Como usaremos o Windows nisso, o nome do arquivo (e, portanto, o quine) deve ter as seguintes limitações:

  • Nenhum desses caracteres \ / : ? * < > |
  • Menos de 211 255 caracteres

Limitações e premissas

  • Seu código deve ser um programa completo (afinal, ele será executado).

  • Nenhuma cópia do arquivo de origem.

  • Você pode assumir que não há outro arquivo com o seu Quine como o nome (como ele produziria o Quine (1)).

  • Erros são permitidos (desde que não entrem no código fonte

Este é o , o código mais curto em bytes vence!

Editar

Talvez eu não tenha sido claro, o arquivo com o nome do quine deve realmente conter o quine. Foi mal.


Quais são as limitações de caracteres não ASCII no programa? (No Windows, isso pode muito possivelmente depender de qual versão de idioma do Windows está instalado; eu esqueço as regras exatas e se eles mudaram ao longo do tempo.)

Por que menos de 211 bytes? Isso é uma espécie de restrição arbitrária ...
mbomb007

@ mbomb007 Tamanho máximo do nome do arquivo, eu acredito.
Addison Crump

11
@VoteToClose It's 255. stackoverflow.com/a/265782/2415524
mbomb007

@ mbomb007 Typo, talvez?
Addison Crump

Respostas:


6

Vitsy, 10 27 bytes

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

Se :fosse permitido, eu poderia reduzi-lo para 11 bytes. :(

Explicação:

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

As duas pilhas serão idênticas no final. Em algumas versões Java, isso pode ocorrer FileNotFoundExceptiondevido a diferentes implementações da FileInputStreamclasse.

Resposta anterior antes da edição:

&'rddd++}.

Explicação:

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

Como eu também poderia, aqui está um diagrama das etapas que ocorrem nas pilhas (cada pilha é representada por []):

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

Na verdade, não tenho certeza de como isso funciona; pequenas alterações fazem com que isso se quebre. Por exemplo, colocando o &em vários outros locais deve funcionar muito bem, mas ele faz com que ClassCastExceptions, IOExceptions, e ArrayOutOfBoundsExceptioné dependendo de onde você colocá-lo. Talvez eu precise fazer algumas correções.


11
+1 paraPush a new stack to the stack stack.
Pavel

11
+1 de mim se você puder enviar uma nova pilha de pilhas para uma pilha de pilhas; caso contrário, esqueça! ... Brincando com +1, eu ri também.
Magic Octopus Urn

2
@carusocomputing E se eu disser que posso o? ;)
Addison Crump

Suspiro de descompactação ...
Magia Octopus Urna

11
Uhm ... Eu acho que o arquivo gerado é suposto para conter o código (ou seja, o seu conteúdo deve ser igual ao seu nome de arquivo)
Leo

5

Node.js, 56 52 bytes

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

Isso imprime o aviso

DeprecationWarning: a chamada de uma função assíncrona sem retorno de chamada foi preterida.

Se você deseja o verde, custa 4 bytes para mudar writeFilepara writeFileSync.


2

Lua, 96 bytes.

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)

Digitei isso no meu telefone, deve funcionar, mas vou testá-lo quando chegar a um computador.


12
Eu acho que pelo menos você precisará mudar sting.formatpara string.formatduas vezes.
Peter Taylor

@ PeterTaylor você não gosta de Sting, não é?
KeyWeeUsr

5
@KeyWeeUsr, não tenho nada contra ele pessoalmente e, de fato, ele ajudou a pagar por minha educação, mas acho que a biblioteca padrão Lua foi provavelmente projetada para uso geral por pessoas familiarizadas com APIs semelhantes, e não especificamente para os fãs da polícia.
22418 Peter Peter Taylor

1

C, 134 bytes

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);}

A fonte aqui contém *para que não pareça permitido de acordo com as regras.
Value Ink

@ValueInk Fixed. Obrigado por apontar isso!
MD XF
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.