Contexte
La séquence 1-2-3-Tribonacci
Imaginez une seconde que vous pourriez faire une séquence de fibonacci en remplaçant la formule d'itération standard par ce qui suit:
Fondamentalement, au lieu de additionner les deux derniers pour obtenir le suivant, vous additionnez les trois derniers. C'est la base de la séquence 1-2-3-Tribonacci.
Critère de Brown
Le critère de Brown indique que vous pouvez représenter n'importe quelle valeur entière comme une somme de membres d'une séquence à condition que:
Pour tout
n
supérieur à 1,
Ce que cela signifie pour le défi
Vous pouvez décrire tout entier positif comme une somme de membres de la séquence 1-2-3-Tribonacci formée par les conditions initiales suivantes:
Ceci est connu car, pour chaque valeur de cette séquence, le rapport entre les termes n'est jamais supérieur à 2 (le rapport s'établit en moyenne à environ 1,839).
Comment écrire dans ce système de représentation numérique
Disons que vous utilisez une représentation peu endienne. Alignez les membres de la séquence comme suit:
1 2 3 6 11 20 37 68
Ensuite, vous prenez votre nombre pour être représenté (pour nos tests, disons que c'est 63
) et trouvez les valeurs des 1-2-3-Tribonacci données qui totalisent 63 (en utilisant les plus grandes valeurs en premier!) . Si le nombre fait partie de la somme, mettez un 1 en dessous, 0 sinon.
1 2 3 6 11 20 37 68
0 0 0 1 0 1 1 0
Vous pouvez le faire pour n'importe quel entier donné - vérifiez simplement que vous utilisez d'abord les plus grandes valeurs sous votre entrée donnée!
Définition (enfin)
Écrivez un programme ou une fonction qui fera ce qui suit étant donné une entrée entière positive n
(écrite dans n'importe quelle base standard) entre 1 et la valeur maximale de votre langue:
- Convertissez la valeur dans la représentation numérique définie de 1-2-3-Tribonacci.
- Utilisez cette représentation de type binaire et lisez-la comme si elle était binaire. Cela signifie que les chiffres restent les mêmes, mais ce qu'ils signifient change.
- Prenez ce nombre binaire et convertissez-le en base du nombre d'origine.
- Sortez ou renvoyez ce nouveau numéro.
Cependant, tant que la sortie est valide, vous n'avez pas besoin de suivre ces étapes. Si vous trouvez comme par magie une formule plus courte (et mathématiquement équivalente), n'hésitez pas à l'utiliser.
Exemples
Soit la fonction f
être la fonction décrite par la définition, et []
représentons les étapes prises (en petit-boutien, même si cela ne devrait pas avoir d'importance) (vous n'avez pas besoin de suivre ce processus, c'est juste le processus décrit):
>>> f(1)
[1]
[1]
[1]
1
>>> f(5)
[5]
[0, 1, 1]
[6]
6
>>> f(63)
[63]
[0, 0, 0, 1, 0, 1, 1]
[104]
104
la source
Réponses:
Javascript
117111 octetsMerci à @theonlygusti pour avoir aidé le golf sur 5 octets
Comment ça fonctionne
Tout d'abord, la fonction génère tous les nombres de tribonacci jusqu'à ce qu'elle en trouve un de plus que l'entrée
Ensuite, il inverse la recherche dans la liste des numéros. Si un nombre est inférieur à l'entrée, il ajoute 2 ^ (index de ce nombre) à la valeur de retour et réduit l'entrée de ce nombre.
Enfin, il renvoie le résultat.
Essayez-le en ligne
la source
a[++i]<x
la condition for pour enregistrer un octet?x>0
parx
. Enregistrez encore 2 octets.Python 2 ,
110102 octets-3 octets grâce à Rod (astuce pour lancer un booléen
i
dans un int avec+i
pour que le repr`+i`
fonctionne)Essayez-le en ligne!
la source
'01'[i]
par`+i`
i
est un booléen et non un int. Edit - Ohhh+i
, soigné.JavaScript (ES6),
9793 octetsIci, nous utilisons
reduce()
une fonction récursive. Nous supposons que la sortie est de 31 bits (ce qui est de toute façon la plus grande quantité non signée avec laquelle JS peut facilement travailler pour les opérations au niveau du bit).En termes de performances, ce n'est clairement pas très efficace.
Pour les curieux:
F()
N + 1reduce()
itérations vs N itérations converge rapidement vers la constante de Tribonacci (≈ 1.83929). Par conséquent, chaque bit supplémentaire dans la sortie coûte environ deux fois plus de temps que le précédent.F()
fonction est appelée 124 millions de fois.Tester
NB: Cela peut prendre 1 ou 2 secondes.
Afficher l'extrait de code
la source
Mathematica,
7874 octetsLinearRecurrence[{1,1,1},{1,2,3},#]
génère une liste, de longueur égale à l'entrée, des nombres tribonacci 1-2-3. (Le{1,1,1}
représente la somme des trois termes précédents, tandis que{1,2,3}
sont les valeurs initiales.)#~NumberDecompose~
Trouve ensuite la manière la plus gourmande d'écrire l'entrée sous la forme d'une somme d'éléments de la liste (c'est la même fonction qui décomposerait un montant monétaire en multiples de les devises disponibles, par exemple). Enfin,Fold[#+##&,...]
convertit la liste binaire résultante en un entier (base-10).Soumission précédente:
Comme c'est souvent le cas (mais pas ci-dessus), cette version golfée est super lente sur des entrées supérieures à 20 environ, car elle génère (avec une récursion non optimisée) une liste de tribus dont la longueur est l'entrée; le remplacement de la finale
#
par une borne plus raisonnableRound[2Log@#+1]
donne de bien meilleures performances.la source
123Tribonacci[]
intégrée?Haskell, 95 octets
Exemple d'utilisation:
f 63
->104
. Essayez-le en ligne! .Comment ça marche:
!
construit la séquence 1-2-3-Tribonacci. Étant donné1
,2
et3
comme paramètres de départ, nous prenons les premiersn
éléments de la séquence. Ensuite , nous plions de la fonction droite#
qui soustrait l'élément suivante
den
et définit le bit de la valeur de retourr
sie
est nécessaire ou laisse le unset bits. Régler le bit est doublerr
et ajouter1
, le laisser non réglé est juste doubler.la source
Gelée , 31 octets
Essayez-le en ligne!
Je suis presque certain qu'il existe un moyen BEAUCOUP plus court d'y parvenir dans Jelly.
Comment?
la source
Perl 6 ,
9391 octets-2 octets grâce à b2gills
Comment ça fonctionne
Tout d'abord, il génère la séquence 1-2-3-Tribonacci jusqu'au premier élément plus grand que l'entrée:
Sur cette base, il trouve le sous-ensemble de la séquence qui s'ajoute à l'entrée:
Sur cette base, il construit une liste de booléens spécifiant si chaque élément de la séquence fait partie de la somme:
Et enfin, il interprète cette liste de valeurs True = 1, False = 0 comme base 2 et la renvoie comme un nombre (base 10):
la source
*>$^n
et.sum==$n
. De plus, l'espace n'est pas nécessaire entremy
et@f
JavaScript (ES6),
6160 octetsCalcule les nombres 1-2-3-Tribonacci jusqu'à ce qu'ils atteignent le nombre d'origine, puis au fur et à mesure que la récursivité se déroule, essaie de soustraire chacun à son tour, doublant le résultat au fur et à mesure.
Edit: 1 octet enregistré grâce à @Arnauld.
la source
n=>(g=(x,y,z)=>(n>x&&g(y,z,x+y+z)*2)+!(n<x||![n-=x]))(1,2,3)
enregistrer un octet?n<x||
mais c'est![]
juste du génie.Lot,
151148145 octetsPort de ma réponse JavaScript. Edit: enregistré 3 octets en passant mes arguments de sous-programme dans l'ordre inverse et 3 autres octets en utilisant des
@
s individuels sur chaque ligne au lieu de@echo off
.la source
Gelée ,
191817 octetsEssayez-le en ligne!
Contexte
Au lieu d'essayer de convertir un entier en base 1,2,3-Tribonacci, puis de binaire en entier, nous ferons le contraire: convertir des entiers en binaire, puis de base 1,2,3-Trionacci en entier, et retourner le plus élevé qui correspond à l'entrée. Cela se fait facilement.
Nous allons illustrer le processus pour l'entrée 63 , en particulier l'étape où 104 est testé. En binaire, du chiffre le plus significatif au moins significatif, 104 est égal à
où la deuxième ligne représente les valeurs de position de ces chiffres.
Nous pouvons étendre la séquence 1,2,3-Tribonacci vers la droite, en observant que les chiffres ajoutés répondent à la même formule récursive. Pour trois chiffres mre, cela donne
Maintenant, pour calculer la valeur du nombre de base 1,2,3-Tribonacci, nous pouvons utiliser la formule récursive. Puisque chaque nombre est la somme des trois nombres à sa droite (dans le tableau ci-dessus), nous pouvons supprimer le premier chiffre et l'ajouter aux trois premiers chiffres du tableau restant. Après 7 étapes, ce qui équivaut au nombre de chiffres binaires de 104 , nous sommes rarement partis avec seulement trois chiffres.
Maintenant, puisque le premier et le dernier chiffre restant ont tous deux la valeur de position 0 , le résultat est le chiffre du milieu, c'est-à-dire 63 .
Comment ça fonctionne
la source
Gelée ( fourchette ),
1716 octetsEnregistré 1 octet grâce à @Dennis qui l'a joué sans même l'exécuter.
Cela repose sur une fourchette de Jelly où je travaille décevant toujours sur la mise en œuvre d'un atome de résolution Frobenius efficace. Pour ceux qui sont intéressés, je voudrais faire correspondre la vitesse de Mathematica
FrobeniusSolve
et heureusement il y a une explication de leur méthode dans le document "Making Change and Finding Repfigits: Balancing a Knapsack" de Daniel Lichtblau.Explication
la source
ḣ3S;µ¡¶3RṚdzæFṪḄ
marcherait? Je n'ai pas votre fourche installée, donc je ne peux pas tester.³
fait référence au premier argument.jelly.py
avait d'autres choses après le dernier commit.cc ,
110102 octetsEh bien, semble que les grands esprits ne se rencontrent. Apparemment, l'algorithme que j'ai trouvé pour contourner les limites de
dc
est par coïncidence exactement le même que celui utilisé dans la réponse de @ LliwTelrac. Intéressant.Essayez-le en ligne!
la source
Python 2 , 93 octets
Ceci est un port de ma réponse Jelly .
Essayez-le en ligne!
la source
utilitaires bash + BSD (OS X, etc.), 53 octets
utilitaires bash + GNU (fonctionne également sous BSD), 59 octets
L'entrée et la sortie dans les deux ci-dessus sont en binaire.
Essayez la version GNU sur TIO. (L'exemple lié à illustre l'entrée de 111111, qui est 63 en binaire, et la sortie de 1101000, qui est de 104 en binaire.)
Je ne pense pas que TIO propose une option BSD, mais si vous avez un Mac disponible, vous pouvez les essayer tous les deux. (Le programme de 59 octets est beaucoup plus rapide que le programme de 53 octets.)
Malheureusement,
seq
ne peut pas simplement être déposé dans la solution BSD à la place dejot
, car le format de sortie deseq
est différent pour les sorties supérieures à 999999. (Cela commence à être un problème pour les entrées autour de 32, puisque 32 ^ 4> 1000000.)Vous pouvez remplacer
jot
ci-dessus parseq -f%.f
pour que cela fonctionne avec les utilitaires GNU, mais pour les mêmes 59 octets, vous pouvez utiliser la solution GNU ci-dessus, qui est beaucoup plus rapide.la source