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:
- Passado como um argumento de linha de comando
- Ler a partir da entrada padrão
- 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 = 0
o 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.
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 nogetInput()
? Aka é a resposta atual do Python válida?n
, produza um programa que é o "programa inicial" de uma série den
iterações ouroboros , e que nossa resposta não deve contar como uma dasn
iterações. Isso está correto?Respostas:
05AB1E , 28 bytes
-4 bytes + correção graças a Kevin Cruijssen
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.
fonte
d
é não negativo (>=0
) em vez de positivo (>0
). O problema é que, para verificard
sem pop-lo, é necessário duplicá-lo primeiro, mas também precisa ser descartado na iteração0"quinsting"
, caso contrário, ele produzirá o duplicado0
. :("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ção0"34çìD«s<Ddiì"34çìD«s<Ddiì
saídas-1
doD
uplicate ..)Encantos Rúnicos , 39 bytes
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 que2+
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 de2?
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.
fonte
Java 10, 145 bytes
Experimente online e veja as saídas de algumas iterações .
Explicação:
explicação quine :
var s
contém o código fonte não formatado%s
é usado para colocar essa String em si mesma coms.format(...)
%c
,,%1$c
e34
são usados para formatar aspas duplass.format(s,34,s)
coloca tudo juntoParte do desafio:
A primeira função lambda recebe uma
long
entrada como parâmetro.Long N=n;
na primeira iteração. OuLong N=%s;
para as próximas iterações.N>0?N-1+"L":"n"
preencherá esse%s
valor com um valorN-1
acrescentado,L
já que é longa e, para convertê-la em uma String para the%s
, seN
for maior que 1. SeN
for 0, em vez disso (a entrada inicial foi0
ou é a última iteração da interquina- ' loop '), preencherá isso%s
com a inicialn
.fonte
long
parâmetro de função e as outras funções lambda usam umVoid
parâmetro não utilizado , que eu também sempre uso para desafios que afirmam não receber nenhuma entrada porquev->
é 1 byte menor que()->
.Haskell ,
195164 bytesExperimente online!
Isso usa uma técnica bastante simples de quine. Nós o modificamos com uma variável
a
definida como um número. Se esse número for zero (como está no início), receberemos e enviaremos nossa fonte coma
o número de entrada. Sea
não for zero, emitimos nossa fonte coma
um valor a menos. Dessa forma, aa
contagem é zero até antes da saída da fonte original.fonte
Geléia ,
2220 bytesExperimente online!
Tente chamadas repetidas de código
fonte
R , 92 bytes
Experimente online!
E se
deparse
for considerado trapaça, aqui está uma alternativa:R , 108 bytes
Experimente online!
fonte
Perl 6 , 44 bytes
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.
fonte
C # (compilador interativo do Visual C #) , 112 bytes
Economizei muitos bytes graças a @NickKennedy!
Experimente online!
fonte
n
s que deveriam serl
s. Como sobre tio.run/##Sy7WTS7O/P@/…Python 3.8 (pré-lançamento) ,
60565553 bytesExperimente 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.
fonte
:=
é uma adição bem-vinda ao Python, com certeza.:=