Cadeia Quine Bidirecional

9

O PPCG ainda não teve cifras suficientes ...

Desafio:

Sua tarefa é criar um programa "A0". Quando este programa é executado sem entrada, ele não produz nada. Quando este programa é executado com entrada, emite "A1". Quando "A1" é executado sem entrada, emite "A0". Quando "A1" é executado com entrada, ele gera "A2". Praticamente, "A (k)" produzirá "A (k-1)" quando executado sem entrada e produzirá "A (k + 1)" quando executado com entrada.

Detalhes

Eu acredito que esse desafio é bastante simples; realmente não existem outras regras. Todo programa deve conter pelo menos 1 byte, a propósito. Você pode assumir que a entrada consistirá apenas de caracteres ASCII e poderá ignorar o espaço em branco, se desejar, mas não poderá especificar uma entrada específica. A saída pode ser STDOUT ou STDERR, mas todos os seus programas devem ser iguais ao mesmo. O outro também pode conter texto (portanto, você pode enviar para STDOUT e sair com um erro). Obrigado a @Dennis por apontar isso.

Todos os programas devem estar no mesmo idioma e cada programa deve ser exclusivo do restante deles.

A pontuação é igual à duração do programa "A0". Como este é um desafio de código-golfe, a pontuação mais baixa vence!

HyperNeutrino
fonte
Estou triste de prever que a maioria das submissões terão A (k) e A (k + 1) diferindo por um único caractere que está sendo adicionado a uma cadeia crescente :(
Sparr
@ Sparr Infelizmente, isso provavelmente será o que acontece. :( Oh, bem, eu não consigo descobrir como fazer uma regra clara contra isso.
HyperNeutrino
você só pode enviar para um dos dois que não tenho certeza se estiver interpretando isso corretamente. Se imprimirmos a saída desejada para STDOUT, STDERR precisará estar vazio? Porque geralmente é permitido sair com um erro.
Dennis
Todos os programas devem ser diferentes? A pergunta não diz isso.
4
Além disso, posso sugerir um título um pouco mais expressivo como "Cadeia Quine Bidirecional"? "super meta quine" não diz muito além dos programas que imprimem outros programas e dificultará a busca por esse desafio no futuro.
Martin Ender

Respostas:

1

Pip , 28 bytes

V Y"I#qSti0+i?`V Y`.RPyRtiu"

Experimente online!

Explicação

Esta é uma versão modificada do quine Pip mais curto conhecido V Y"`V Y`.RPy". Essa solução funciona definindo uma string, puxando-a para a yvariável e, em seguida, avaliando-a. Quando avaliada, a sequência recebe o repr y(envolvendo o valor entre yaspas duplas) e concatena o padrão literal `V Y`para a frente.

Nossa estratégia é colocar um 0no programa e substituí-lo 0por 10se houver entrada ou substituir 10por 0se não houver entrada. (Assim, A ( k ) conterá um número que consiste em k 1 seguido de um 0.) 0e 10é conveniente porque existem variáveis ​​internas ( ie t, respectivamente) com esses valores, para que possamos nos referir a elas sem usar dígitos reais .

Então, em vez de RPy, queremos RP yRitse houve entrada e RP yRtise não houver. Podemos combinar os dois casos trocando os valores de te ise houver input ( I#q Sti) e, em seguida, fazendo RP yRti. (Temos que testar #qo comprimento da entrada, porque entradas como 0são falsey.)

Agora, apenas precisamos obter um literal 0no código e lidar com o caso especial de A0 que não produz saída. Ambos podem ser resolvidos testando 0+ie retornando use for falsey:

  • Para qualquer k > 0, o número em A ( k ) será diferente de zero e, portanto, verdadeiro (por exemplo 110+i).
  • Para k = 0, o número em A ( k ) será zero:
    • Se houver entrada ie tfor trocado e ifor 10. 0+iainda é verdade.
    • Se não houver entrada, iainda será 0 e 0+iserá falsey. Em vez do núcleo quine, produzimos u, que é uma variável interna para zero. A impressão nula não produz saída.
DLosc
fonte
Bom trabalho! Funciona como um encanto.
HyperNeutrino
1

Python 2, 93 bytes

Há um avanço de linha à direita.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

Experimente com entrada | Experimente sem entrada

Isso é modificado da minha resposta em uma pergunta semelhante.

Se houver entrada, ele será incrementado p. Assim, o programa resultante será p=2+..., p=3+..., etc.

mbomb007
fonte
Esta não reconhece 0 como entrada
fənɛtɪk
@LliwTelracs A entrada deve estar entre aspas (deve ser uma picada). Veja os hiperlinks na resposta.
mbomb007
Como é, o programa trabalha com cordas e todos os números de outros que 0.
fənɛtɪk
11
@LliwTelracs Bem, não tente usar números então. De acordo com o consenso, posso usar input()e exigir que a entrada esteja entre aspas, em vez de usar raw_input(). Se você deseja inserir zero, use "0".
mbomb007
Ótima solução! Eu esperava que a maioria das respostas crescesse infinitamente (tecnicamente, essa, mas não no mesmo sentido). Bom trabalho!
HyperNeutrino