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.


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.


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


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!


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.


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!


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

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


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.


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

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