El objetivo de este código de golf es crear un programa o función que calcule y genere la raíz cúbica de un número que se proporciona como entrada.
Las normas:
- Sin recursos externos
- No se utilizan funciones de raíz de cubo incorporadas.
- No se utilizan métodos / operadores que puedan elevar un número a una potencia (que incluye raíz cuadrada, cuarta raíz, etc.).
- Su función / programa debe poder aceptar números de punto flotante y números negativos como entrada.
- Si la raíz cúbica es un número de coma flotante, redondea a 4 números después del punto decimal.
- Este es un código de golf, gana el código más corto en bytes.
Casos de prueba:
27 --> 3
64 --> 4
1 --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7 --> 1.9129
Puede usar todos los casos de prueba anteriores para probar números negativos ( -27 --> -3
, -64 --> -4
...)
Respuestas:
J: 16 caracteres
Traducción suelta de la respuesta de Haskell:
Casos de prueba:
Funciona así:
En palabras:
No es una de las mejores traducciones verbales, ya que hay una bifurcación diádica y una
~
derecha al final.fuente
Haskell - 35
Ejecuciones de ejemplo:
Además, si importa
Data.Complex
, incluso funciona en números complejos, devuelve una de las raíces del número (hay 3):El
:+
operador debe leerse como 'más i veces'fuente
x=(2*x+n/x/x)/3
, ¿puedes explicar por qué puedes usarlox=(x+n/x/x)/2
? Converge más despacio pero no puedo explicar por qué converge ...x=cbrt(n)
, entoncesx=(x+n/x/x)/2
es cierto. Entonces, ¿es cierto para su expresiónSageMath, (69) 62 bytes
Sin embargo, nunca creas que te dará el resultado, es muy difícil ir al azar a través de todos los números:
si no insististe en truncar:
SageMath, 12 bytes, si
exp
está permitidoFunciona para todo: positivo, negativo, cero, complejo, ...
fuente
exp
está permitido, bajaré a 12 y no seré estúpido en absoluto :)exp
es la abreviatura de "función exponencial", que es "una función cuyo valor es una constante elevada a la potencia del argumento, especialmente la función donde la constante es e", y hay "No se utilizan métodos / operadores que puede elevar un número a una potencia ",exp
no está permitido.Python - 62 bytes
Evalúa con precisión de punto flotante completo. El método utilizado es el método de Halley . Como cada iteración produce 3 veces más dígitos correctos que la última, 99 iteraciones son un poco exageradas.
De entrada y salida:
fuente
0
-2
, perdón por eso.v**(1/.3)
sería un ganador seguro.Javascript (55)
function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}
BONIFICACIÓN, formulación general para todas las raíces.
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}
Para la raíz cúbica, simplemente use
f(n,3)
, raíz cuadradaf(n,2)
, etc. Ejemplo:f(1024,10)
devuelve2
.Explicación
Basado en el método de Newton:
Buscar:
f(x) = x^3 - n = 0
la solución esn = x^3
La derivación:
f'(x) = 3*x^2
Iterar:
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2
Pruebas
fuente
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 bytes
Solución iterativa:
fuente
0.0001
puede ser reemplazado por1e-4
y0.00001
por1e.5
.0/0
daNAN
en PHP 7).$i=0;
es innecesario (-5 bytes. Si no fuera así,for
ahorraría un byte). El espacio posteriorprint
no es necesario (-1 byte).-R
puede guardar 3 bytes con$argn
.while(1e-4+$i*$i*$i<$y=abs($x=$argn))
(-2 bytes).Perl, 92 bytes
a
devuelve una cadena con el número sin una parte de fracción innecesaria o ceros insignificantes en el extremo derecho.Resultado:
Generado por
El cálculo se basa en el método de Newton :
fuente
APL - 31
Utiliza el hecho de que
cbrt(x)=e^(ln(x)/3)
, pero en lugar de hacer una⋆
exponenciación ingenua , calculae^x
usando la serie Taylor / Maclaurin.Ejecuciones de muestra:
Como hay una respuesta J en 16 caracteres, debo ser realmente terrible en APL ...
fuente
Java,
207182181A veces, cuando juego al golf, tomo dos cervezas y juego realmente muy mal
Método de aproximación iterativo de Newton, ejecuta 99 iteraciones.
Aquí está el no golfista:
fuente
args
variable a algo comoz
, reduciendo 6 caracteres. Puede eliminar el espacio y las llaves en el cuerpo del bucle for, reduciendo 3 caracteres. Puede reemplazar10000.0
por1e4
, reduciendo 6 caracteres. La clase no necesita ser pública, por lo que puede reducir más 7 caracteres. De esta manera se reducirá a 185 caracteres.TI-Basic,
2624 bytesfuente
^
operador, ¿no? Está prohibido por las reglase^
Es un solo operador en la serie TI-83? No me acuerdo De cualquier manera, está violando el espíritu de las reglas.exp(ln(x)/3)
oe^(ln(x/3))
si permitiera alguno de estos dos. Pero de alguna manera entiendo queexp(ln(x)/a)
es demasiado equivalente ax^(1/a)
ser permitido por las reglas: - /Js 57 bytes
f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
fuente
Javascript: 73/72 caracteres
Este algoritmo es poco convincente y explota el hecho de que esta pregunta está limitada a 4 dígitos después del punto decimal. Es una versión modificada del algoritmo que sugerí en el sandbox con el propósito de reelaborar la pregunta. Cuenta desde cero hasta el infinito
h*h*h<a
, solo con un truco de multiplicación y división para manejar la precisión de 4 dígitos decimales.Edición, 4 años después: como sugirió Luis felipe De jesus Munoz, usar
**
el código es más corto, pero esa característica no estaba disponible en 2014 cuando escribí esta respuesta. De todos modos, al usarlo, afeitamos un personaje adicional:fuente
h*h*h
, puede hacerh**3
y guardar 1 byte**
operador fue propuesto en 2015 y fue aceptado como parte de ECMAScript 7 en 2016. Entonces, en el momento en que escribí eso, no había**
en el idioma.Javascript - 157 caracteres
Esta función:
Versión explicada de Ungolfed:
fuente
PHP, 61
Basado en el método de Newton. Versión ligeramente modificada de la respuesta de Michael :
Funciona con números negativos, puede manejar números de coma flotante y redondea el resultado a 4 números después del punto decimal si el resultado es un número de coma flotante.
Demostración de trabajo
fuente
for($x=1;++$i<100;)...
. Pero el uso de variables predefinidas como entrada generalmente está mal visto . Mejor uso$argv[1]
o$argn
.Befunge 98 - Trabajo en progreso
Este lenguaje no admite números de coma flotante; esto intenta emularlos. Actualmente funciona para números positivos que no comienzan
0
después del punto decimal (principalmente). Sin embargo, solo genera 2 decimales.Funciona ingresando la parte antes del punto decimal, multiplicándola por
100000
, luego ingresando la parte después del punto y sumando los dos números. La segunda línea hace un contador hasta que el cubo es mayor que el número ingresado. Luego, la tercera línea extrae el número decimal del entero.Si alguien puede decirme por qué la tercera línea solo se divide
100
para obtener los valores correctos, dígame.IOs:
fuente
Smalltalk, 37
el crédito va a mniip por el algoritmo; Versión Smalltalk de su código:
entrada en n; salida en x:
o como un bloque
fuente
Lenguaje GameMaker, 51 bytes
fuente
Haskell: 99C
No se puede vencer a @mniip en inteligencia. Acabo de ir con una búsqueda binaria.
Sin golf:
fuente
d
(como(l#h)x
) para guardar un byte para cada llamada.c
entonces se convierteid>>=(0#)
.c < x
.1>0
lugar deTrue
.J 28
Usando el método de Newton, encontrar la raíz del
x^3 - X
paso de actualización esx - (x^3 - C)/(3*x^2)
, donde x es la suposición actual y C la entrada. Hacer las matemáticas en este caso produce la expresión ridículamente simple de(2*x+C/x^2) /3
. Se debe tener cuidado con los números negativos.Implementado en J, de derecha a izquierda:
|
Toma abdominales de ambos argumentos, pásalos^:_
Hacer hasta la convergencia(%*~@])
esC / x^2
(*~ y
es equivalente ay * y
)+:@]
es2 x
3%~
dividir por tres. Esto produce la raíz positiva*@[ * positive_root
multiplica la raíz positiva con el signo de C.Prueba de funcionamiento:
fuente
AWK, 53 bytes
Ejemplo de uso:
Gracias a @Mig por la
JavaScript
solución de la que se deriva. Se ejecuta sorprendentemente rápido dado que elfor
ciclo requiere que la iteración deje de cambiar.fuente
C, 69 bytes
Solo otra implementación del método de Newton. Pruébalo en línea!
fuente
Stax , 10 bytes CP437
¡Ejecute y depure en línea!
Explicación
Utiliza la versión desempaquetada para explicar.
fuente
Solución JAVA
Public BigDecimal cubeRoot (número BigDecimal) {
fuente
Solución Python
fuente