Vous pouvez décomposer un nombre supérieur à 0 comme une somme unique de nombres de Fibonacci positifs. Dans cette question, nous le faisons en soustrayant à plusieurs reprises le plus grand nombre de Fibonacci positif possible . Par exemple:
1 = 1
2 = 2
3 = 3
4 = 3 + 1
12 = 8 + 3 + 1
13 = 13
100 = 89 + 8 + 3
Maintenant, j'appelle un produit Fibonacci les mêmes listes que ci-dessus, mais avec l'addition remplacée par la multiplication. Par exemple f(100) = 89 * 8 * 3 = 2136
,.
Écrivez un programme ou une fonction qui a donné un entier positif n renvoie le produit de Fibonacci de ce nombre.
Testcases:
1: 1
2: 2
3: 3
4: 3
5: 5
6: 5
7: 10
8: 8
9: 8
42: 272
1000: 12831
12345: 138481852236
code-golf
math
sequence
fibonacci
code-golf
word
code-golf
cipher
code-golf
string
math
subsequence
code-golf
regular-expression
code-golf
brainfuck
assembly
machine-code
x86-family
code-golf
math
factorial
code-golf
math
geometry
code-golf
math
arithmetic
array-manipulation
math
number
optimization
stack
metagolf
code-golf
tips
assembly
code-golf
tips
lisp
code-golf
number-theory
path-finding
code-golf
number
sequence
generation
code-golf
math
geometry
code-golf
grid
permutations
code-golf
code-golf
graphical-output
geometry
fractal
knot-theory
code-golf
math
arithmetic
code-golf
interpreter
balanced-string
stack
brain-flak
code-golf
math
set-theory
code-golf
math
array-manipulation
code-golf
code-golf
string
natural-language
code-golf
code-golf
math
linear-algebra
matrix
code-golf
string
encode
orlp
la source
la source
2
peut être décomposé en-1 + 3
. L'énoncé correct du théorème de Zeckendorf est qu'un nombre de Fibonacci positif peut être décomposé de manière unique comme une somme de nombres de Fibonacci non consécutifs avec un indice positif.Réponses:
Gelée ,
1615 octetsPas particulièrement rapide ou convivial, mais suffisamment efficace pour tous les cas de test. Essayez-le en ligne!
Comment ça fonctionne
la source
Python, 54 octets
Juste une bonne vieille récursivité.
la source
Perl,
6963 + 4 (-pl61
indicateur) = 67 octetsEn utilisant:
Non golfé:
Ideone .
la source
061
est le codage ASCII pour le caractère'1'
. Joli hack à utiliser$\
pour le faire imprimer presque gratuitement.JavaScript (ES6),
7842 octetsPort de la réponse de @ Sp3000. Version originale de 78 octets:
la source
> <> , 57 octets
Attend que le numéro d'entrée soit présent sur la pile au démarrage du programme.
Construit la séquence de Fibonacci (
f0, f1, f2, ..., fn
) sur la pile jusqu'à ce qu'un nombre supérieur à l'entrée (i
) soit atteint . Ensuite, avec un produit (p
) initialisé à1
...Essayez-le en ligne!
la source
Pyth, 28 octets
Je pense qu'il peut être joué beaucoup plus loin ...
Essayez-le en ligne!
la source
Pyth, 24 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
Q
est attribué avec le numéro d'entrée.La partie
h.WgQeH,eZsZ1
calcule le plus grand nombre de Fibonacci, inférieur ou égal àQ
Donc, si
Q = 10
, il génère les nombres / paires:Le reste du code calcule la partition et multiplie les nombres ensemble:
Il y a évidemment beaucoup de solutions plus courtes (avec des temps d'exécution vraiment mauvais), comme
*FhfqQsTyeM.u,eNsNQ1
.la source
Haskell, 44 octets
Ouais pour la récursion mutuelle:
a
est le numéro de Fibonacci précédentb
est le nombre actuel de Fibonaccic
est l'entréef
est la fonction souhaitéeMoins golfé:
la source
En fait, 22 octets
Essayez-le en ligne!
Explication:
la source
Javascript (ES6)
13410692 bytesMerci pour @cat d'avoir repéré un espace.
Juste une version non optimisée faite sur mon téléphone, je la joue au golf, une fois à la maison. Les idées sont les bienvenues.
la source
RETOUR , 44 octets
Try it here.
Lambda anonyme étonnamment inefficace qui laisse le résultat sur Stack2. Usage:
REMARQUE: ␌ et ␁ sont des espaces réservés pour leurs caractères non imprimables respectifs: Form Feed et Start of Heading .
Explication
la source
PHP, 119 octets
Le code (enroulé sur deux lignes pour plus de lisibilité):
La première ligne calcule dans
$f
les nombres de Fibonacci inférieurs à$n
(l'argument fourni dans la ligne de commande). La deuxième ligne calcule les facteurs de Fibonacci (par soustraction) et les multiplie pour calculer le produit en$o
.Ajoutez le code avec
<?php
(techniquement ne fait pas partie du programme), placez-le dans un fichier (fibonacci-factors.php
) puis exécutez-le en tant que:Ou exécutez-le en utilisant
php -d error_reporting=0 -r '... code here ...' 100
.Le code non golfé et la suite de tests peuvent être trouvés sur Github .
la source
Q, 47 octets
Tester
le lire sous forme de paires (i, map (m, i)), où m est la fonction de calcul et i les différents arguments
écrit
Explication
n funtion\arg
applique la fonction (fonction (fonction (fonction (... fonction (args)))) n fois (utilise en interne la récursion tal) et renvoie la séquence de résultats. Nous calculons les 60 premiers éléments de la série fibonnaci comme*+60(|+\)\1 0
. Dans ce cas, la fonction est ( | +): + \ appliqué sur une séquence calcule des sommes partielles (ex + \ 1 2 3 est 1 3 6), et | inverse la suite. Ainsi, à chaque 'itération', nous calculons des sommes partielles des deux nombres de fibonacci précédents et retournons la partie les sommes inversées60(|+\)\1 0
génèrent des séquences 1 0, 1 1, 2 1, 3 2, 5 3, 8 5, 13 8, 21 13, ...*+
appliquées sur ce résultat retournez-les (transposez) et prenez la première. Le résultat est la séquence 1 1 2 3 5 8 13 21 34 55 ..(cond)function\args
applique la fonction (fonction (.. fonction (args))) tandis que cond true, et renvoie la séquence de résultats partielsfunction[arg]
appliqué sur une fonction de plusieurs arguments crée une projection (application partielle)Nous pouvons donner un nom aux arguments, mais les noms implicites sont x, y, z
{y-x x bin y}[*+60(|+\)\1 0]
déclare un lambda avec args x, y avec projection partielle (arg x est une série de fibonacci, calcule comme * + 60 (| +) \ 1 0). x représente les valeurs de fibonacci, et y le nombre à traiter. La recherche binaire (bin) est utilisée pour localiser l'indice du plus grand nombre de fibonacci <= y (x bin y
), et soustraire la valeur correspondante de x.Pour calculer le produit à partir de résuls partiels, nous les inversons et calculons la différence de chaque paire (
-':|
), supprimons la première (1_
car est 0) et multiplions sur (*/
).Si nous sommes intéressés par la somme accumulée, le code est le même, mais avec
+/
au lieu de*/
. Nous pouvons également utiliser n'importe quel autre opérateur diadique au lieu de + ou *À propos de l'efficacité d'exécution
Je sais que dans ce concours, l'efficacité n'est pas un problème. Mais dans ce problème, nous pouvons aller du coût linéaire au coût exponentiel, donc je suis curieux de le savoir.
J'ai développé une deuxième version (longueur 48 octets hors commentaire) et répété des tests de batterie 1000 fois sur les deux versions.
le temps d'exécution est: version originale 0'212 seg, nouvelle version 0'037 seg
La version originale calcule la série fibbonaci une fois par application de fonction; nouvelle version calcule fibonacci un seul.
Dans les deux cas, le calcul des séries de fibonacci utilise la récursivité de la queue
la source