Quine Incremental

23

Sua tarefa é escrever um programa ou função que produza o primeiro caractere de seu código-fonte, depois o segundo e depois o terceiro ... cada vez que é executado.

Por exemplo, se o seu programa estava foono idioma bardo arquivo baz.bar, você deve obter uma saída semelhante a esta:

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

Seu programa pode fazer qualquer coisa quando terminar de imprimir o código-fonte dessa maneira. Você pode modificar o código fonte do arquivo, mas lembre-se de que o código fonte a ser impresso é o código fonte original .

Este é um código de golfe, portanto o programa mais curto em bytes vence.

Conor O'Brien
fonte
1
Se podemos modificar o código fonte do arquivo, isso significa que também podemos lê-lo?
FlipTack
1
@ Flp.Tkc Boa pergunta. Eu honestamente não tenho idéia. Não quero que você construa o quine lendo a fonte, mas tudo bem se você ler a fonte apenas para a modificação do arquivo.
Conor O'Brien

Respostas:

6

Gelatina , 12 bytes

“;⁾vṾ®ȯ©Ḣ”vṾ

Este é um link niládico. Experimente online! (Inclui código para chamar o link doze vezes.)

Como funciona

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

Como um bônus adicional, uma vez que o registro conterá uma sequência vazia após a chamada dos doze, é mais uma vez falso e o link está pronto para começar de novo. Chamar o link 24 vezes produzirá o código-fonte duas vezes, 36 vezes três vezes, etc.

Dennis
fonte
Não conheço Jelly, então o que o rodapé faz com precisão? Porquê ^ 17?
Conor O'Brien
Chame o link acima ( ¢), função de identidade ( ¹, realmente não é necessária após a primeira chamada), defina o valor de retorno como avanço de linha ( imprime implicitamente o valor de retorno anterior), repita. ¹e são ambos sobrescritos, mas não estão relacionados. Substituí-os pelos menos confusos ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(ligar, concatenar, repetir).
Dennis
12

Javascript - 26 bytes

Define f()que retorna o código-fonte caractere por caractere.

n=0;f=x=>("n=0;f="+f)[n++]

Retorna indefinido após ficar sem caracteres.

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness

Maltysen
fonte
Se não me engano, você deve incluir a chamada de função como parte do código.
Mama Fun Roll
Link do @MamaFunRoll para a meta post relevante?
Downgoat
Não conheço nenhum: P No entanto, sempre achei que a própria chamada de função fazia parte do quine; talvez haja algo que esteja faltando?
Mama Fun Roll
@MamaFunRoll A especificação permite especificamente funções, portanto, uma chamada não deve ser necessária. De qualquer maneira, não faria muito sentido para esse desafio particular.
Dennis
Tudo bem, apenas certificando-se.
Mama Fun Roll
2

empilhados , não-concorrentes, 34 bytes

[tostr ':!' + execCounter # out]:!

Uma variação na quine padrão. Este é um programa completo. Isso é usado execCounterpara obter quantas vezes esse programa foi executado especificamente. Erros após a saída de tudo.

Experimente aqui!

Conor O'Brien
fonte
2

Pip , 31 bytes

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

Uma função anônima. Teste no TIO!

Explicação

Comece com este padrão Pip quine:

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

Enrole isso em chaves para torná-lo uma função. Agora, em vez de retornar toda a fonte, precisamos indexá-la. O uso de uma variável global para o índice e o incremento a cada vez atenderão ao requisito "próximo caractere toda vez que for chamado". vé o melhor candidato porque é pré-inicializado para -1. Incrementá-lo na primeira vez fornece um índice de 0, da próxima vez 1etc.

O Pip possui indexação cíclica, portanto, uma vez que a função imprima seu último caractere, ela começará novamente.

DLosc
fonte
1

Python, 90 bytes

Uma extensão no padrão Python Quine (dicas de golfe são bem-vindas):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

Esta é uma função de gerador de python , o que significa que você itera sobre ela e cada iteração fornece o próximo caractere no código-fonte. Quando todos os caracteres foram retornados, isso trava IndexError.

Para testar, basta anexar este script ao final do programa:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

Ou experimente online!

FlipTack
fonte
1

*> <> , 13 21 bytes

" r:2+a1Fi1+:1F1+[ro;

Cria um arquivo chamado \npara acompanhar o índice.

Pode ser que você possa jogar mais golfe, mas nada imediatamente salta para mim ...

Saída

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

Explicação

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

Trapaça Incremental Quine

a1Fi1+:0go1F;

Explicação

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit
redstarcoder
fonte
haha, eu não tinha ideia de que você poderia nomear um arquivo "\ n". Embora isso tecnicamente leia o código fonte, pela ginstrução.
Conor O'Brien
@ ConorO'Brien, ah bastante justo. hmm ...
redstarcoder 21/12
*> <> Tem algum tipo de indexação de pilha? Ou comandar repetição? Em seguida, você pode usar a estrutura quine padrão "your code goes here;para> <> e acessar o n-ésimo membro da pilha
Conor O'Brien
@ ConorO'Brien sim, o Teal Pelican me mostrou essa variante quine na minha outra resposta trapaça :).
Reddarcoder 21/12
1
@redstarcoder Eu tenho trabalhado mais em quines (YAY!) e descobri um bom truque, se você substituir r por #, você pode: 1- o # curtir; #; ou [+ 1F1: + 1iF1a-1: "Não posso testar isso no momento, mas acredito que corta 1 byte do seu código.> <> quines podem ser feitos como #o <-1:" etc: D
Teal pelican
1

Mathematica, 91 bytes

Comentários muito bem-vindos; Eu ainda estou aprendendo as cordas sobre o que são apropriados.

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

Define uma função chamada repetidamente sem argumentos. Após a 91ª chamada, gera um grande erro e retorna sem avaliação.

Havia dois problemas a serem superados: primeiro, eu queria apenas usar StringTake[ToString[#0]<>"[]"], mas ToString[]parece apagar as aspas; então eu tive que substituir "[]"por FromCharacterCode[{91, 93}]. Segundo, as variáveis ​​do Mathematica começam não inicializadas, então não posso ligar ++qantes de qser definido; é por isso que a inicial If[!NumberQ[q], q = 0]é necessária.

Coda irrelevante: ao olhar para cima NumberQ, aprendi que o Mathematica tem uma função chamada TrueQ... que, sim, retorna Truese o argumento é Truee Falsese o argumento é False! (O utilitário é que ele retorna Falsetodos os outros argumentos também.)

Greg Martin
fonte
1

Microscript II, 40 33 bytes

Um literal de bloco de código, o equivalente mais próximo da linguagem a uma função:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

Após a execução, ele se recoloca xpara facilitar a chamada novamente.

SuperJedi224
fonte
0

Bash (e zsh, ksh), 39 bytes

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

Não imprime nada após a impressão do programa.

Verifique 0se não existe no diretório atual e execute:

bash iquine.bash
Kaito Udagawa
fonte
Bem-vindo ao PPCG! Você tem uma ideia inteligente para aumentar o índice. Infelizmente, parece que essa resposta funciona lendo seu próprio código-fonte, o que significa que não é uma solução válida para nossos padrões . Se você modificá-lo para usar outras técnicas além de ler sua própria fonte, será uma boa resposta.
DLosc 25/12/16