Le défi
Le nombre plastique est un nombre lié au nombre d'or, avec de nombreuses propriétés mathématiques intéressantes. En tant que tel, il existe de nombreuses approches qui peuvent être utilisées pour calculer le nombre.
Afin de spécifier précisément le nombre aux fins de ce défi, nous utiliserons la définition suivante (bien qu'il existe de nombreuses définitions équivalentes, et vous pouvez utiliser n'importe quelle définition de votre choix tant qu'il s'agit du même nombre):
Le nombre plastique est un nombre réel ρ tel que ρ ³ = ρ +1.
Votre défi consiste à écrire un programme ou une fonction qui prend un entier x en entrée (avec x > 1), et produit une approximation de ρ en sortie, de sorte que plus la valeur de x est grande, plus la sortie se rapproche de ρ ( avec au maximum un nombre infini d'exceptions; rester à la même valeur compte comme "plus proche" à cet effet), et pour tout nombre positif δ , il y a une entrée x dans votre programme qui produit une sortie qui est à moins de δ de ρ .
Clarifications
- Si vous effectuez une sortie via une méthode qui génère de manière inhérente des chaînes (par exemple le flux de sortie standard), vous pouvez formater la sortie soit en décimal (par exemple
1.3247179572
), soit comme un rapport de deux entiers avec un/
caractère entre eux. - Si vous générez une valeur dans votre langage de programmation (par exemple, en revenant d'une fonction), elle doit être de type à virgule fixe, à virgule flottante ou rationnelle. (En particulier, vous ne pouvez pas utiliser des types de données qui stockent des nombres symboliquement, à moins qu'ils ne soient utilisés que pour maintenir le rapport de deux entiers. Donc, si vous utilisez Mathematica ou un langage similaire, vous devrez inclure le supplément pour générer réellement les chiffres de la sortie.)
- Votre réponse doit fonctionner dans une variante hypothétique de votre langue dans laquelle les entiers peuvent être arbitrairement grands et la mémoire (y compris la pile) est illimitée. Vous ne pouvez pas supposer que l'arithmétique à virgule flottante dans votre langue est arbitrairement précise, mais devez plutôt utiliser sa précision réelle (ce qui signifie que la sortie d'un nombre à virgule flottante ne sera possible que dans les langues où la précision des nombres à virgule flottante peut être contrôlé à l'exécution).
- x peut avoir la signification que vous voulez (tant que l'augmentation donne des sorties plus précises). J'imagine que la plupart des soumissions le feront contrôler le nombre de chiffres de sortie à produire, ou le nombre d'itérations de l'algorithme utilisé par votre programme pour converger sur le nombre plastique, mais d'autres significations sont acceptables.
Cas de test
Voici les premiers chiffres du numéro en plastique:
1.32471795724474602596090885
Plus de chiffres sont disponibles sur OEIS .
Condition de victoire
Comme d'habitude pour le code-golf , plus court est meilleur, mesuré en octets. Cependant, n'hésitez pas à publier des réponses même si elles ne gagnent pas, tant qu'elles ajoutent quelque chose (par exemple une langue différente ou un algorithme différent) aux réponses existantes.
Réponses:
Python 2 , 49 octets
Essayez-le en ligne!
L'idée est d'exprimer le
ρ
avecρ³=ρ+1
comme une fractionn/x
dont le dénominateurx
est le paramètre de précision d'entrée. Nous prenons(n/x)³=n/x+1
et dégageons les dénominateurs à obtenirn³=x²(x+n)
.Étant donné que le LHS augmente
n
plus rapidement que le RHS, nous pouvons approximer le point d'égalitén
comme le plus petit avecn³≥x²(x+n)
. Le code compten
jusqu'à ce que ce soit le cas, à partirx
duquel il est plus petit.Un petit octet de sauvegarde consiste à diviser les deux côtés en
x²
écrituren³/x²≥x+n
(annulé dans lawhile
condition). Il s'agit de la division du plancher dans le code, mais la partie fractionnelle perdue est négligeable.Une alternative de même longueur met
x
à la place comme numérateur:Python 2 , 49 octets
Essayez-le en ligne!
la source
2**input()
plutôt que simplementinput()
; ensuite, chaque approximation sera au moins aussi précise que la précédente.Mathematica, 20 octets
La
Root
fonction intégrée de Mathematica donne les solutions d'une équation polynomialef[x] == 0
.Explication
Exemple d'E / S
la source
Root[x^3-x-1,1]~N~#&
fonctionne très bien (bien que je ne dise pas quex
c'est une variable) pour le même nombre d'octets.Mathematica, 27 octets
-1 octet de Martin
-2 octets de ovs
contribution
sortie
la source
Solve[x^3==x+1>2,x]~N~#&
pour 24 octets{{x -> 1.32...}}
cependant. Vous voudrez peut-être vérifier avec ais si c'est un format de sortie valide.{1.32...}
fait, mais ce format est probablement moins litigieux.sed ,
6760 (59 + 1) octetsEssayez-le en ligne!
+1 pour le
-E
drapeau (ERE au lieu de BRE). L'entrée et la sortie sont toutes les deux unaires: entrée 11111 pour x = 5, par exemple, la sortie est une fraction de deux nombres unaires: l'entrée 11111 susmentionnée donne la sortie 11111/1111 (5/4 en décimal).Approximation du nombre de plastique sous forme de fraction entre les éléments consécutifs de la séquence Padovan .
la source
b
commande, mais vous pouvez la raccourcir encore en utilisant l'étiquette vide (:
etb
sans argument). tio.run/#%23K05N@f@/…t
place deb
, c'est donc une sauvegarde plutôt sympa. Merci :)Mathematica, 27 octets
Utilise une approximation tronquée de la forme du radical cubique imbriqué ³√ (1 + ³√ (1 + ³√ (1 + ...))) . Bien que la sortie contienne toujours x-1 décimales, le résultat est en fait moins précis que cela, car l'expression converge plus lentement qu'un chiffre par itération ( x est également utilisé comme nombre de radicaux imbriqués calculés). Par exemple, x = 100 donne
où la partie soulignée est correcte.
la source
dc
, mais j'ai été bloqué car il s'avère qu'il n'a pas d'opération de racine cubique, et augmenter un nombre à la puissance ⅓ ne fonctionne pas non plus :-( Au moins, vous pouvez toujours compter sur Mathematica disposera de modules internes appropriésCubeRoot
mais personne n'a d'octets pour ça.Octave , 50 octets
Essayez-le en ligne!
Définit une fonction anonyme, avec
n
le nombre souhaité de chiffres de sortie.Cette réponse abuse qui
digits
renvoie le paramètre actuel pour le nombre de chiffres dans l'arithmétique à précision variable. Cela signifie que nous pouvons simplement l'utiliser dans une fonction anonyme sans erreur sur «Trop d'arguments de sortie».En dehors de cela, c'est vraiment simple:
vpasolve
est l'abréviation de Résolution arithmétique à précision variable, avec la précision définie par le dernier appel dedigits
. Comme ilvpa
s'agit d'un type de données symbolique dans Octave, qui est interdit par la spécification, nous enveloppons simplement la fonction entièrechar(...)
pour obtenir une sortie de chaîne. Notez que danssolve
etvpasolve
, lef==0
est implicite, a doncr^3==r+1
été remplacé parr^3-r-1 (==0)
la source
MATL (
2728 octets)Ma première solution (27 octets)
Essayez-le en ligne!
Ce n'est certainement pas optimal, je m'habitue toujours à MATL.
Explication:
Je crée une séquence Padovan jusqu'à l'entrée + 3 puis trouve le rapport des deux derniers nombres.
Sortie de fraction appropriée
(35 octets)(28 octets, @Sanchises):Cependant, la première solution ne répond pas au besoin de précision arbitraire étant la limite à virgule flottante des paramètres MATL par défaut. Ainsi, plutôt que d'ajouter plusieurs octets pour étendre cette précision, il est plus simple de prendre la route de fraction appropriée et d'écrire une fraction des deux derniers nombres entiers dans les (N-1) ème et N ème éléments de la séquence Padovan tronquée.
par exemple "114/86"
7BG: "t @) y @ 1 +) + h] tG3 +) V '/' YcyG2 +) VYcAvec l'aimable autorisation de l'utilisateur @Sanchises. :)
Essayez-le en ligne!
Évaluation non itérative:
Notamment, mon code le plus court pour la version «exacte» est (23 octets):
Essayez-le en ligne!
... mais ne donne pas de précision arbitraire. Je me demande si quelqu'un peut ajuster cela pour respecter les règles (utiliser l'entrée, etc.) et ajouter encore moins de 5 octets? : P
la source
1+
peut être raccourci à.Q
Avec cela à l'esprit, vous pouvez remplacer@)y@1+)+
par juste@tQh)s
. De plus, vous pouvez utiliserJ
pour indiquer la fin d'un tableau; et enfin, MATL ne fait pas de distinction entre les tableaux normaux et les tableaux de caractères, vous pouvez donc les remplacerYc
parh
(vous n'avez pas besoin des fonctionnalités supplémentaires deYc
). Cela donne seulement 28 octets:7BG:"t@tQh)sh]tJ)V47hyJq)Vh&
(notez le&
pour éviter une sortie superflue et remplacez-le'/'
par 47).7B
bien, bien mieux que de pousser naïvementlllv
J
contient par défaut1j
, mais le presse-papiersL
contient également de nombreuses fonctions d'indexation utiles (notez que c'est1j
égalend
en MATL).M ,
1514 octetsEssayez-le en ligne!
Algorithme
Cela utilise des rationnels et la méthode de Newton. Plus précisément, pour l'entrée x , les premières x itérations avec la valeur de départ x sont appliquées.
Nous essayons de trouver une racine spécifique du polynôme p (t) = t³ - t - 1 . La méthode de Newton y parvient en prenant une valeur de départ t 0 - suffisamment proche de ρ - et en définissant récursivement une séquence par
t n + 1 = t n - p (t n ) / p '(t n ) .
Puisque p '(t) = 3t² -1 , on obtient
t n + 1 = t n - (t n ³ - t n - 1) / (3t n ² - 1) = (3t n ³ - t n - t n ³ + t n + 1) / (3t n ² - 1) = (2t n ³ + 1) / (3t n ² - 1) .
Notez que l'approximation initiale x s'aggrave progressivement à mesure que x augmente. Alors que la sortie pour x = 3 est légèrement moins précise que la sortie pour x = 2 , puisque la méthode de Newton converge de façon quadratique vers ρ , cela ne devrait pas être un problème pour les grandes valeurs de x .
Comment ça marche
la source
µ¡
...Julia 0,5 ,
4440 octetsUtilise les logiques et la méthode de Newton.
Essayez-le en ligne!
la source
05AB1E , 23 octets
Essayez-le en ligne!
Port direct de /codegolf//a/126822/59376 par xnor.
la source
Fusain , 28 octets
Essayez-le en ligne! Lien vers le mode verbeux. J'ai aussi apparemment foiré
Divide
etIntDivide
: |Utilise la même méthode que les réponses Python et JavaScript.
la source
NewStack , 14 octets
Panne:
Comment ça marche:
La formule (2x 3 +1) / (3x 2 -1) provient de la simplification de la méthode de Newton pour l'équasion x 3 = x + 1. Vous pouvez le trouver ici . Répéter ce processus une infinité de fois converge vers le nombre plastique. Son taux de convergence est plutôt rapide à environ 2,6 décimales par itération.
Alternative à la séquence Padovan,
272517 octetsPanne:
-2 octets en choisissant une meilleure stratégie d'impression
-8 octets en choisissant une meilleure façon d'indexer la pile
Comment ça marche:
Au fur et à mesure que la séquence de Padovan se poursuit, le rapport des deux derniers éléments converge vers le nombre de plastique.
la source
Clojure, 46 octets
Utilise la formule itérée de racine cubique. C'est un peu plus intéressant mais plus long:
la source
Javascript, 36 octets
Fonctionne de la même manière que la réponse python supérieure. Non
console.log
était inclus car si vous exécutezf(x)
dans la console, il sera enregistré automatiquement.la source
> <> , 38 + 3 = 41 octets
Attend que l'entrée soit présente sur la pile au démarrage du programme, donc +3 octets pour l'
-v
indicateur.Essayez-le en ligne!
Effectue efficacement une recherche binaire pour affiner la valeur de sortie. L'
x
augmentation augmente le nombre d'itérations à effectuer.Edit: calcul légèrement refactorisé pour économiser 1 octet, version précédente:
la source
k, 27 octets
Essayez-le en ligne! Cela suppose des nombres infinis (ce qui, hélas, n'est pas vrai). Il utilise la séquence Padovan .
la source
TI-BASIC, 21 octets
Utilise cette formule récursive .
Fait intéressant, coder en dur le nombre et l'arrondir donne le même nombre d'octets:
TI-BASIC, 21 octets
Utilise cette formule trigonométrique .
la source
Your answer must work in a hypothetical variant of your language in which integers can be arbitrarily large, and memory (including stack) is unlimited. You may not assume that floating-point arithmetic in your language is arbitrarily accurate, but must instead use its actual accuracy (meaning that outputting a floating-point number is only going to be possible in languages where the accuracy of floating-point numbers can be controlled at runtime).
C # , 317 octets
Il renvoie le résultat sous forme de fraction.
Explication
Il utilise la méthode de Newton avec x itérations pour trouver la racine du polynôme p ^ 3-p-1 = 0. La formule est x_n = 1- (f (x_ (n-1))) / (f '(x_ (n-1))), et x_0 est un point de départ.
La dérivée des polynômes est 3p ^ 2-1, et disons x_ (n-1) = b / c. Ensuite, en utilisant la formule ci-dessus, nous obtenons que x_n = (2 b ^ 3 + c ^ 3) / (3 b ^ 2 cc ^ 3). Disons également que nous partons de 1, cela se produira lorsque x = 2, car x> 1, et est un entier. Code identifié et commenté:
la source
PHP, 86 octets
PHP Sandbox Online
Crée la spirale de Padovan et imprime le rapport des deux derniers nombres.
la source
Axiome, 96 octets
résultats
comment vous pouvez voir h (2) devrait être 1,32 et non 1,33, donc il y a une erreur dans les derniers chiffres
Ensuite, il y aurait celui de 110 octets
Il utilise la formule pour résoudre l'équation de grade III de type x ^ 3-3 * p * x-2 * q = 0 dans le cas q ^ 2-p ^ 3> = 0 qui est m = sqrt (q ^ 2- p ^ 3) et x = (q + m) ^ (1/3) + (qm) ^ (1/3)
Dans notre cas r ^ 3-r-1 = 0, cela peut être écrit comme r ^ 3-3 * (1/3) r-2 * (1/2) = 0 donc p = 1/3 q = 1/2 m = 1 / 4-1 / 27 = 23/108 x = (0,5 + m) ^ (1/3) + (0,5-m) ^ (1/3)
celui-ci qui utilise l'itération de Newton avec le point de départ r = 1
il change dans la fonction, valeur des chiffres pour obtenir un obj de n + 1 chiffres après le point flottant. À la fin, la valeur digits () est affectée à la valeur précédente.
la source
Rubis , 35 octets
Essayez-le en ligne!
la source