Ouroboros Quine de nível n


11

Esse quine ouroboros de 128 idiomas (um programa que gera um programa em outro idioma, que gera um programa em outro idioma (125 idiomas depois), que gera o programa original) é bastante impressionante. Mas, infelizmente, ele tem um número estático de iterações.

Escreva um programa que emita um programa (não necessariamente em outro idioma, mas pode ser), que emita um programa, que emita um programa, etc., que após n iterações, emita o programa original pela primeira vez (ou seja, nenhum intermediário O programa deve ser o mesmo que o original, porque, caso contrário, um quine que ignora sua entrada funcionaria), em que n é um número inteiro não negativo fornecido como entrada. A entrada não pode ser apenas um número no código-fonte original (por exemplo, colocar x = <the value of n>no início do seu programa), deve ser uma das seguintes:

  1. Passado como um argumento de linha de comando
  2. Ler a partir da entrada padrão
  3. Passado como argumento para uma função, que retorna / gera o novo programa.

Para estágios intermediários no ouroboros, seu programa pode ser um programa totalmente funcional ou uma função sem argumentos, que, quando chamada, retornará / produzirá o próximo.

Você não pode ler a partir do próprio arquivo de origem ou usar quaisquer componentes internos do tipo quine (não acho que exista algum que faça isso, mas pode haver)

Para ficar claro, se n = 0o programa deve gerar seu próprio código-fonte.

Se n = 1, o programa deve emitir um programa diferente, que gera o código fonte original.

E assim por diante...

Menos bytes ganha!

Editar:

Eu deveria ter escrito "Para estágios intermediários no ouroboros, seu programa pode ser um programa totalmente funcional sem entrada ou uma função sem argumentos". Se o seu programa gerar o próximo na cadeia, então aguarde pela entrada, tudo bem, mas seu programa não deve precisar do valor original de n.



Podemos 1 índice n? Assim, n = 1 significa imprimir o código de fonte, n = 2 significa imprimir o código que irá imprimir o código de fonte, etc.
Expirado dados

11
As versões da iteração ainda terão a entrada inicial? Então, digamos que minha primeira entrada seja 3, e eu corro o programa que ela produz. Ainda haverá uma entrada 3 ou nenhuma entrada? Se não houver entrada, acho que precisamos lidar com isso, caso algo como getInput()seja usado sem nenhuma entrada fornecida. Ou podemos dizer que introduza algo aleatório que não seja usado em iterações posteriores, para evitar erros no getInput()? Aka é a resposta atual do Python válida?
Kevin Cruijssen 03/07/19

Suspeito que o que nos é pedido fazer, dado um número inteiro n, produza um programa que é o "programa inicial" de uma série de niterações ouroboros , e que nossa resposta não deve contar como uma das niterações. Isso está correto?
Erik the Outgolfer 03/07/19

@KevinCruijssen Eu provavelmente deveria ter sido mais claro sobre isso. Os estágios intermediários não podem ter entrada de nenhuma forma. Eu acho que se o programa exibir o próximo e aguardar a entrada, tudo bem.
Leo Tenenbaum

Respostas:


5

05AB1E , 28 bytes

-4 bytes + correção graças a Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì

Experimente online!


Explicação

Isso funciona anexando o número restante a ser impresso na frente do código, o que significa que ele é adicionado à pilha da mesma maneira que uma entrada seria. No caso base da entrada "0", não concatenará o 0 na frente.


dé não negativo ( >=0) em vez de positivo ( >0). O problema é que, para verificar dsem pop-lo, é necessário duplicá-lo primeiro, mas também precisa ser descartado na iteração 0"quinsting", caso contrário, ele produzirá o duplicado 0. :(
Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ìtalvez por 28 bytes (o que ainda é bastante parecido com a abordagem pretendida)? (Temo sua versão atual para a iteração 0"34çìD«s<Ddiì"34çìD«s<Ddiìsaídas -1do Duplicate ..)
Kevin Cruijssen

4

Encantos Rúnicos , 39 bytes

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

Experimente online!

Seria 4 bytes menor que 05AB1E usando a mesma tática se as entradas fossem menores ou iguais a 10. Mas, como precisamos apoiar valores arbitrariamente grandes, fica mais complicado.

O valor numérico de né colocado na frente e analisado como um literal de número contínuo usando ´. "3X4+kSqé o código quine básico. Se nenhum valor estiver presente na frente, o comprimento da pilha será apenas 1 (o quine), caso contrário 2 permitirá l1=d*?determinar como lidar com as coisas a partir daí.

  • Se houver um valor, S:1-}'LA2+-}execute: troque o valor para o topo, subtraia 1, duplique-o, deixando uma cópia na parte inferior da pilha, obtenha o Log 10 desse valor vezes 100 (resultando no próprio tamanho do caractere, mais 1 para the ´), remova muitos caracteres do final da string (efetivamente se truncando no final, tanto onde não é necessário quanto porque possui o valor errado). Cé um byte menor que 2+e resulta no mesmo valor.

  • Se não houver um valor, leia um da entrada.

Independentemente: :0)2*?duplicar e comparar com zero.

  • Se for diferente de zero ´.

  • Se zero, pop o valor. Podemos trapacear usando em !vez de 2?e salvar um byte, porque quando ´tenta executar o primeiro byte que ele vê não é numérico e imediatamente sai do modo numérico na mesma posição.

Imprima toda a pilha de cima para baixo.


3

Java 10, 145 bytes

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Experimente online e veja as saídas de algumas iterações .

Explicação:

explicação :

  • O var scontém o código fonte não formatado
  • %s é usado para colocar essa String em si mesma com s.format(...)
  • %c,, %1$ce 34são usados ​​para formatar aspas duplas
  • s.format(s,34,s) coloca tudo junto

Parte do desafio:

A primeira função lambda recebe uma longentrada como parâmetro.

  • Isso é definido na variável Long N=n;na primeira iteração. Ou Long N=%s;para as próximas iterações.
  • A verificação ternária N>0?N-1+"L":"n"preencherá esse %svalor com um valor N-1acrescentado, Ljá que é longa e, para convertê-la em uma String para the %s, se Nfor maior que 1. Se Nfor 0, em vez disso (a entrada inicial foi 0ou é a última iteração da interquina- ' loop '), preencherá isso %scom a inicial n.

A especificação diz saídas intermediárias tem que ser um programa completo ou uma função sem argumentos
Personificação da ignorância

@EmbodimentofIgnorance Eu sei, é isso que eu tenho. A primeira função lambda usa um longparâmetro de função e as outras funções lambda usam um Voidparâmetro não utilizado , que eu também sempre uso para desafios que afirmam não receber nenhuma entrada porque v->é 1 byte menor que ()->.
Kevin Cruijssen 04/07/19

2

Haskell , 195 164 bytes

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

Experimente online!

Isso usa uma técnica bastante simples de quine. Nós o modificamos com uma variávela definida como um número. Se esse número for zero (como está no início), receberemos e enviaremos nossa fonte com ao número de entrada. Se anão for zero, emitimos nossa fonte com aum valor a menos. Dessa forma, a acontagem é zero até antes da saída da fonte original.



2

R , 92 bytes

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

Experimente online!

E se deparse for considerado trapaça, aqui está uma alternativa:

R , 108 bytes

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

Experimente online!


1

Perl 6 , 44 bytes

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

Experimente online!

Recebe entrada por entrada padrão e retorna um programa em que a única coisa alterada é o primeiro número. Cada programa subseqüente emitirá o mesmo programa, exceto com esse número diminuído.



1

Python 3.8 (pré-lançamento) , 60 56 55 53 bytes

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

Experimente online!

-2 bytes graças a Jo King

A partir da versão de 53 bytes, também funciona no Python 2 e Python 3.


A função intermediária não parece ser um programa completo ou uma função que não aceita argumentos.
Nick Kennedy

Esse operador de morsa :=é uma adição bem-vinda ao Python, com certeza.
Mbomb007 03/07/19

"Para estágios intermediários no ouroboros, seu programa pode ser um programa totalmente funcional ou uma função sem argumentos que, quando chamados, retornarão / produzirão o próximo."
Mbomb007 03/07/19

@NickKennedy Atualizado para obedecer às especificações e salvou coincidentemente 4 bytes.
negativo sete /

11
53 bytes sem usar:=
Jo King
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.