Um Quine é um programa que gera sua fonte quando executado.
Neste desafio, você deve fazer um Fibonacci-quine, uma variante do quine.
O que é um Fibonacci-quine?
Um Fibonacci-quine é um programa que gera uma modificação da fonte pela seguinte regra:
A fonte inicial deve ser ...2...
. Em outras palavras, a fonte deve conter 2
. (Por que 2? Se fosse 1, ninguém saberia se era o primeiro 1 ou o segundo, até o próprio programa)
Quando executado, você deve gerar a fonte, mas apenas o número específico (neste estágio 2
) mudou para o próximo número da sequência de fibonacci. Por exemplo ...3...
,. O mesmo vale para a saída, e a saída da saída, etc. Você pode suportar números inteiros até 2 ^ 32-1. Para números inteiros acima desse limite, a próxima saída é a sua escolha.
Nota do OP
Eu realmente gostaria de ver uma solução criativa para isso. Não consegui pensar em uma solução única para isso, pois os dois aspectos importantes do desafio, fibonacci e quine, não são fáceis. Estarei esperando então!
Respostas:
Mathematica, 61 bytes
Observe que há um espaço à direita. Esta é uma função quine, ou seja, o código acima é avaliado para uma função sem nome que, se chamada, retorna o próprio código como uma string (com a
2
alteração para o próximo número de Fibonacci).Isso foi surpreendentemente complicado para começar a trabalhar. A idéia básica é pegar a função em si (com
#0
) e substituir um número nessa função pela próxima usando/. v:2 :> nextFib[v]
. No entanto,nextFib
não seríamos avaliados nesta fase, para que não terminássemos com o novo número no código-fonte. Depois de pesquisar um pouco para descobrir como forçar a avaliação imediata, encontrei este ótimo post no Mathematica.SE . A técnica "padrão" usa umWith
bloco que força a avaliação, mas a segunda resposta do WReach contém uma alternativa mais curta usando o built-in não documentadoRuleCondition
que também força a avaliação.A maneira como calculamos o próximo número de Fibonacci é usando o fato de que a proporção de números consecutivos é aproximadamente a proporção áurea de 1,618 ... e isso é preciso até o arredondamento. Portanto, não precisamos acompanhar os dois últimos números e podemos simplesmente fazê-lo
Round[GoldenRatio v]
. Isso nunca perderá precisão, pois o MathematicaGoldenRation
é um valor simbólico e, portanto,Round
sempre pode calcular um resultado preciso.Em suma:
Uma função sem nome, em que
#0
se refere ao próprio objeto da função.Encontre a
2
na árvore de expressão da função (é2
claro que isso só corresponde a si mesmo), chame-ov
e substitua-o por ...... o próximo número de Fibonacci.
E converta a árvore de expressão resultante em sua representação de sequência.
fonte
CJam , 26 bytes
Experimente online!
Provavelmente não é o ideal. Simplesmente iteramos a sequência de Fibonacci até que o valor seja maior que o último e usamos o resultado como o novo valor no início do programa.
fonte
Python 3 , 95 bytes
Experimente online!
Obviamente, um garfo da resposta CJam de Martin Ender .
fonte
CJam , 20 bytes
Experimente online!
fonte
Na verdade , 19 bytes
Experimente online!
Obviamente, um garfo da resposta CJam de Martin Ender .
fonte
Python 3 ,
8179 bytesExperimente online!
Usa a proporção áurea para calcular o próximo número
fonte
Gelatina , 14 bytes
Experimente online! ou verifique todas as iterações necessárias .
Como funciona
fonte
Rápido, 251 bytes
Um pouco detalhado para mim, mas não consigo descobrir como reduzi-lo:
Ungolfed:
Meu problema é tentar obter as cotações da nova versão do
s
.fonte
Queijo Cheddar , 136 bytes
Experimente online!
fonte
Javascript (ES6),
15160 bytesNova versão, créditos para @ Leaky Nun
Versão antiga :
Com base nisso .
fonte
x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
31000
não é um número de Fibonacci.dc , 35 bytes
Uma versão com iteração (56 bytes):
fonte
Rápido, 235 bytes
Esta é uma versão melhorada do Caleb 's resposta .
fonte
Java (OpenJDK 8) , 239 bytes
Experimente online!
fonte