Un Quine est un programme qui sort sa source lors de son exécution.
Dans ce défi, vous devez faire une Fibonacci-quine, une variante de la quine.
Qu'est-ce qu'une Fibonacci-quine?
Un Fibonacci-quine est un programme qui génère une modification de la source selon la règle suivante:
La source initiale devrait être ...2...
. En d'autres termes, la source doit contenir 2
. (Pourquoi 2? Si c'était 1, personne ne saurait si c'était le premier 1 ou le second, même le programme lui-même)
Lors de l'exécution, vous devez générer la source, mais seul le numéro spécifique (à ce stade 2
) a été remplacé par le numéro suivant de la séquence fibonacci. Par exemple ...3...
,. Il en va de même pour la sortie et la sortie de la sortie, etc. Vous pouvez prendre en charge des nombres entiers jusqu'à 2 ^ 32-1. Pour les entiers supérieurs à cette limite, la sortie suivante est sur votre choix.
Note de l'OP
J'aimerais vraiment voir une solution créative pour cela. Je ne pouvais pas penser à une seule solution pour cela, car les deux aspects importants du défi, fibonacci et quine, ne sont pas faciles. J'attendrai alors!
Réponses:
Mathematica, 61 octets
Notez qu'il y a un espace de fin. Il s'agit d'une fonction quine, c'est-à-dire que le code ci-dessus est évalué comme une fonction sans nom qui, s'il est appelé, renvoie le code lui-même sous forme de chaîne (avec le
2
changement au numéro de Fibonacci suivant).C'était étonnamment difficile de se rendre au travail. L'idée de base est de prendre la fonction elle-même (avec
#0
) et de remplacer un nombre dans cette fonction par la suivante en utilisant/. v:2 :> nextFib[v]
. Cependant,nextFib
ne serait pas évalué à ce stade, donc nous ne nous retrouverions pas vraiment avec le nouveau numéro dans le code source. Après avoir cherché pendant un certain temps pour comprendre comment forcer une évaluation immédiate, j'ai trouvé cet excellent article sur Mathematica.SE . La technique "standard" utilise unWith
bloc qui force l'évaluation, mais la deuxième réponse de WReach contient une alternative plus courte utilisant la fonction intégrée non documentéeRuleCondition
qui force également l'évaluation.La façon dont nous calculons le prochain nombre de Fibonacci est en utilisant le fait que le rapport des nombres consécutifs est à peu près le nombre d'or 1,618 ... et cela est précis jusqu'à l'arrondi. Nous n'avons donc pas besoin de garder une trace des deux derniers chiffres et pouvons simplement le faire
Round[GoldenRatio v]
. Cela ne perdra jamais sa précision car MathematicaGoldenRation
est une valeur symbolique etRound
peut donc toujours calculer un résultat précis.En résumé:
Une fonction sans nom, où
#0
fait référence à l'objet de fonction lui-même.Trouvez un
2
dans l'arborescence d'expression de la fonction (cela2
ne correspond bien sûr qu'à lui-même), appelez-lev
et remplacez-le par ...... le prochain numéro de Fibonacci.
Et convertissez l'arbre d'expression résultant en sa représentation sous forme de chaîne.
la source
CJam , 26 octets
Essayez-le en ligne!
Probablement pas tout à fait optimal. Nous itérons simplement la séquence de Fibonacci jusqu'à ce que la valeur soit supérieure à la dernière et utilisons le résultat comme nouvelle valeur au début du programme.
la source
Python 3 , 95 octets
Essayez-le en ligne!
De toute évidence, une fourchette de la réponse CJam de Martin Ender .
la source
CJam , 20 octets
Essayez-le en ligne!
la source
En fait , 19 octets
Essayez-le en ligne!
De toute évidence, une fourchette de la réponse CJam de Martin Ender .
la source
Python 3 ,
8179 octetsEssayez-le en ligne!
Utilise le nombre d'or pour calculer le nombre suivant
la source
Gelée , 14 octets
Essayez-le en ligne! ou vérifiez toutes les itérations requises .
Comment ça fonctionne
la source
Swift, 251 octets
Un peu bavard pour moi, mais je ne sais pas comment le raccourcir:
Non golfé:
Mon problème est d'essayer d'obtenir les citations autour de la nouvelle version de
s
.la source
Cheddar , 136 octets
Essayez-le en ligne!
la source
Javascript (ES6),
15160 octetsNouvelle version, crédits à @ Leaky Nun
Ancienne version :
Sur cette base .
la source
x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
31000
n'est pas un numéro de Fibonacci.DC , 35 octets
Une version avec itération (56 octets):
la source
Swift, 235 octets
Il s'agit d'une version améliorée de la réponse de Caleb .
la source
Java (OpenJDK 8) , 239 octets
Essayez-le en ligne!
la source