Le but de ce code golf est de créer un programme ou une fonction qui calcule et génère la racine cubique d'un nombre donné en entrée.
Les règles:
- Pas de ressources externes
- Aucune utilisation des fonctions de racine de cube intégrées.
- Pas d'utilisation de méthodes / opérateurs qui peuvent élever un nombre à une puissance (qui inclut la racine carrée, la 4ème racine, etc.).
- Votre fonction / programme doit pouvoir accepter des nombres à virgule flottante et des nombres négatifs en entrée.
- Si la racine du cube est un nombre à virgule flottante, arrondissez-le à 4 chiffres après la virgule décimale.
- Il s'agit d'un code golf, le code le plus court en octets gagne.
Cas de test:
27 --> 3
64 --> 4
1 --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7 --> 1.9129
Vous pouvez utiliser tous les cas de test ci-dessus pour tester des nombres négatifs ( -27 --> -3
, -64 --> -4
...)
Réponses:
J: 16 caractères
Traduction lâche de la réponse Haskell:
Cas de test:
Cela fonctionne comme ceci:
Dans les mots:
Pas l'une des meilleures traductions verbeuses, car il y a une fourchette dyadique et un
~
droit à la fin.la source
Haskell - 35
L'exemple s'exécute:
De plus, si vous importez
Data.Complex
, cela fonctionne même sur des nombres complexes, il renvoie une des racines du nombre (il y en a 3):L'
:+
opérateur doit être lu comme «plus i fois»la source
x=(2*x+n/x/x)/3
, pouvez-vous expliquer pourquoi vous pouvez l'utiliserx=(x+n/x/x)/2
? Il converge plus lentement mais je ne peux pas expliquer pourquoi il converge ...x=cbrt(n)
, alorsx=(x+n/x/x)/2
c'est vrai. Il en est de même pour votre expressionSageMath, (69) 62 octets
Cependant, ne croyez jamais que cela vous donnera le résultat, il est très difficile de parcourir tous les chiffres au hasard:
si vous n'avez pas insisté pour tronquer:
SageMath, 12 octets, si
exp
autoriséFonctionne pour tout: positif, négatif, zéro, complexe, ...
la source
exp
c'est permis, j'ai moins de 12 ans et je ne suis pas stupide du tout :)exp
c'est l'abréviation de "fonction exponentielle", qui est "une fonction dont la valeur est une constante élevée à la puissance de l'argument, en particulier la fonction où la constante est e.", Et il n'y a "pas d'utilisation de méthodes / opérateurs qui peut élever un nombre à une puissance ",exp
n'est pas autorisé.Python - 62 octets
Évalue la précision en virgule flottante complète. La méthode utilisée est la méthode de Halley . Comme chaque itération produit 3 fois plus de chiffres corrects que la dernière, 99 itérations est un peu exagéré.
Entrée sortie:
la source
0
-2
, désolé.v**(1/.3)
serait un gagnant sûr.Javascript (55)
function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}
BONUS, Formulation générale pour toutes les racines
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}
Pour la racine cubique, utilisez simplement
f(n,3)
, racine carréef(n,2)
, etc ... Exemple:f(1024,10)
retourne2
.Explication
Basée sur la méthode Newton:
Trouver:,
f(x) = x^3 - n = 0
la solution estn = x^3
la dérivation:
f'(x) = 3*x^2
Itérer:
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2
Les tests
la source
function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
f=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
PHP - 81 octets
Solution itérative:
la source
0.0001
peut être remplacé par1e-4
et0.00001
par1e.5
.0/0
donneNAN
en PHP 7).$i=0;
est inutile (-5 octets. Si ce n'était pas le cas,for
cela économiserait un octet.) L'espace aprèsprint
n'est pas requis (-1 octet).-R
peut économiser 3 octets avec$argn
.while(1e-4+$i*$i*$i<$y=abs($x=$argn))
(-2 octets).Perl, 92 octets
a
renvoie une chaîne avec le nombre sans partie de fraction inutile ou zéros insignifiants à l'extrémité droite.Résultat:
Généré par
Le calcul est basé sur la méthode de Newton :
la source
APL - 31
Utilise le fait que
cbrt(x)=e^(ln(x)/3)
, mais au lieu de faire une⋆
exponentiation naïve , il calcule ene^x
utilisant la série Taylor / Maclaurin.Exemples de cycles:
Vu qu'il y a une réponse J en 16 caractères, je dois être vraiment terrible à APL ...
la source
Java,
207182181Parfois, quand je joue au golf, j'ai deux bières et je joue vraiment très mal
La méthode d'approximation itérative de Newton exécute 99 itérations.
Voici les non golfés:
la source
args
variable en quelque chose commez
, en réduisant 6 caractères. Vous pouvez supprimer l'espace et les accolades dans le corps de la boucle for, réduisant ainsi 3 caractères. Vous pouvez remplacer10000.0
par une1e4
réduction de 6 caractères. La classe n'a pas besoin d'être publique, vous pouvez donc réduire plus de 7 caractères. De cette façon, il sera réduit à 185 caractères.TI-Basic,
2624 octetsla source
^
opérateur, n'est-ce pas. Il est interdit par les règlese^
- t -il un seul opérateur sur la série TI-83? Je ne m'en souviens pas. Quoi qu'il en soit, cela viole l'esprit des règles.exp(ln(x)/3)
oue^(ln(x/3))
si vous autorisez l'un de ces deux. Mais d'une certaine manière, je comprendsexp(ln(x)/a)
que c'est trop équivalent àx^(1/a)
être autorisé par les règles: - /Js 57 octets
f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
la source
Javascript: 73/72 caractères
Cet algorithme est boiteux et exploite le fait que cette question est limitée à 4 chiffres après la virgule décimale. Il s'agit d'une version modifiée de l'algorithme que j'ai suggérée dans le bac à sable afin de retravailler la question. Il compte de zéro à l'infini
h*h*h<a
, juste avec une astuce de multiplication et de division pour gérer la précision des 4 chiffres décimaux.Edit, 4 ans plus tard: Comme suggéré par Luis felipe De jesus Munoz, en utilisant
**
le code est plus court, mais cette fonctionnalité n'était pas disponible en 2014 lorsque j'ai écrit cette réponse. Quoi qu'il en soit, en l'utilisant, nous nous rasons un caractère supplémentaire:la source
h*h*h
vous pouvez faireh**3
et enregistrer 1 octet**
opérateur a été proposé en 2015 et a été accepté dans le cadre d'ECMAScript 7 en 2016. Donc, au moment où j'ai écrit cela, il n'y en avait pas**
dans la langue.Javascript - 157 caractères
Cette fonction:
Version expliquée non golfée:
la source
PHP, 61
Basé sur la méthode de Newton. Version légèrement modifiée de la réponse de Michael :
Il fonctionne avec des nombres négatifs, peut gérer des nombres à virgule flottante et arrondit le résultat à 4 nombres après la virgule décimale si le résultat est un nombre à virgule flottante.
Démo de travail
la source
for($x=1;++$i<100;)...
. Mais l'utilisation de variables prédéfinies en entrée est généralement mal vue . Mieux utiliser$argv[1]
ou$argn
.Befunge 98 - Travaux en cours
Cette langue ne prend pas en charge les nombres à virgule flottante; cela tente de les imiter. Il fonctionne actuellement pour les nombres positifs qui ne commencent pas par (
0
après la virgule décimale) (principalement). Cependant, il ne produit que 2 décimales.Il fonctionne en saisissant la pièce avant le point décimal, en multipliant cela par
100000
, puis en saisissant la pièce après le point et en additionnant les deux nombres. La deuxième ligne fait un compteur jusqu'à ce que le cube soit supérieur au nombre entré. Ensuite, la troisième ligne extrait le nombre décimal de l'entier.Si quelqu'un peut me dire pourquoi la troisième ligne se divise uniquement
100
pour obtenir les valeurs correctes, veuillez me le dire.OI:
la source
Smalltalk, 37
le mérite revient à mniip pour l'algorithme; Version Smalltalk de son code:
entrée en n; sortie en x:
ou, en bloc
la source
Langue GameMaker, 51 octets
la source
Haskell: 99C
Impossible de battre @mniip en intelligence. Je suis juste allé avec une recherche binaire.
Non golfé:
la source
d
(comme(l#h)x
) pour enregistrer un octet pour chaque appel.c
devient alorsid>>=(0#)
.c < x
.1>0
place deTrue
.J 28
En utilisant la méthode Newtons, trouver la racine de
x^3 - X
l'étape de mise à jour estx - (x^3 - C)/(3*x^2)
, où x est la supposition actuelle et C l'entrée. Faire le calcul sur celui-ci donne l'expression ridiculement simple de(2*x+C/x^2) /3
. Il faut faire attention aux nombres négatifs.Implémenté en J, de droite à gauche:
|
Prenez les abdos des deux arguments, transmettez-les^:_
Faire jusqu'à la convergence(%*~@])
estC / x^2
(*~ y
est équivalent ày * y
)+:@]
est2 x
3%~
divisez par trois. Cela donne la racine positive*@[ * positive_root
multiplie la racine positive par le signe de C.Essai:
la source
AWK, 53 octets
Exemple d'utilisation:
Merci à @Mig pour la
JavaScript
solution dont elle dérive. Il s'exécute étonnamment rapidement étant donné que lafor
boucle nécessite l'itération pour arrêter de changer.la source
C, 69 octets
Juste une autre implémentation de la méthode de Newton. Essayez-le en ligne!
la source
Stax , 10 octets CP437
Exécutez et déboguez en ligne!
Explication
Utilise la version décompressée pour expliquer.
la source
Solution JAVA
public BigDecimal cubeRoot (nombre BigDecimal) {
la source
Solution Python
la source