Inspirado en este video de tecmath .
Se x
puede encontrar una aproximación de la raíz cuadrada de cualquier número tomando la raíz cuadrada entera s
(es decir, el entero más grande de ese tipo s * s ≤ x
) y luego calculando s + (x - s^2) / (2 * s)
. Llamemos a esto aproximación S(x)
. (Nota: esto es equivalente a aplicar un paso del método Newton-Raphson).
Aunque esto tiene peculiaridad, donde S (n ^ 2 - 1) siempre será √ (n ^ 2), pero en general será muy preciso. En algunos casos más grandes, esto puede tener una precisión> 99.99%.
Entrada y salida
Tomarás un número en cualquier formato conveniente.
Ejemplos
Formato: Entrada -> Salida
2 -> 1.50
5 -> 2.25
15 -> 4.00
19 -> 4.37 // actually 4.37 + 1/200
27 -> 5.20
39 -> 6.25
47 -> 6.91 // actually 6.91 + 1/300
57 -> 7.57 // actually 7.57 + 1/700
2612 -> 51.10 // actually 51.10 + 2/255
643545345 -> 25368.19 // actually 25,368.19 + 250,000,000/45,113,102,859
35235234236 -> 187710.50 // actually 187,710.50 + 500,000,000/77,374,278,481
Especificaciones
Su salida debe redondearse al menos a la centésima más cercana (es decir, si la respuesta es 47.2851, puede generar 47.29)
Su salida no tiene que tener los siguientes ceros y un punto decimal si la respuesta es un número entero (es decir, 125.00 también puede salir como 125 y 125.0)
No tiene que admitir ningún número inferior a 1.
No tiene que admitir entradas no enteras. (es decir, 1.52, etc.)
Reglas
Las lagunas estándar están prohibidas.
Este es un código de golf , por lo que la respuesta más corta en bytes gana.
fuente
s + (x - s^2) / (2 * s) == (x + s^2) / (2 * s)
Respuestas:
Jalea ,
87 bytes-1 byte gracias a la fórmula matemática simplificada de Olivier Grégoire : vea su respuesta Java .
Pruébalo en línea!
¿Cómo?
fuente
÷ƽ+ƽH
primera vez que trato de usar Jelly, así que podría estar equivocado. Sinƽ
embargo, desearía saber cómo almacenar para no repetirlo. Eso podría salvar otro byte.ƽɓ÷⁹+H
no volvería a calcular la raíz entera, pero también es 7.ɓ
comienza una nueva cadena diádica con argumentos intercambiados y luego se⁹
refiere al argumento correcto de esa cadena (es decir, el resultado deƽ
).ƽɓ÷+⁹H
Trabajaría aquí también.Haskell , 34 bytes
Pruébalo en línea!
Explicación en pseudocódigo imperativo:
fuente
Java (OpenJDK 8) , 32 bytes
Pruébalo en línea!
Explicaciones
El código es equivalente a esto:
Las matemáticas detrás:
fuente
Python 2 ,
47... 36 bytes-3 bytes gracias a @JungHwanMin
-1 byte gracias a @HyperNeutrino
-2 bytes gracias a @JonathanFrech
-3 bytes gracias a @ OlivierGrégoire
Pruébalo en línea!
fuente
s+(x-s*s)/s/2
a(x+s*s)/s/2
+.0
y reemplazar/s/2
con/2./s
guardar dos bytes?MATL ,
129 bytesPruébalo en línea!
fuente
R,
43 bytes29 bytesGracias a @Giuseppe por la nueva ecuación y ayuda en el golf de 12 bytes con la solución de división entera. Al cambiar la llamada a la función para escanear, jugué otros dos bytes.
Pruébalo en línea!
fuente
f <-
para asignar la función. Pero aún así, buena solución, ¡asegúrese de leer Consejos para jugar golf en R cuando tenga la oportunidad!APL (Dyalog) ,
2016 bytesPruébalo en línea!
fuente
JavaScript (ES7), 22 bytes
Realmente no necesitamos una variable intermedia, por lo que en realidad se puede reescribir como:
Casos de prueba
Mostrar fragmento de código
fuente
C, 34 bytes
¡Gracias a @Olivier Grégoire!
Funciona solo con
float
entradas.Pruébalo en línea!
C,
413937 bytesPruébalo en línea!
C,
49474543 bytesPruébalo en línea!
¡Gracias a @JungHwan Min por guardar dos bytes!
fuente
Haskell , 40 bytes
Otro bytes el polvo gracias a H.PWiz.
Pruébalo en línea!
fuente
AWK ,
47 4438 bytesPruébalo en línea!
NOTA: El TIO like tiene 2 bytes adicionales para
\n
que la salida sea más bonita. :)Se siente como engañar un poco usar sqrt para encontrar la raíz cuadrada, así que aquí hay una versión con algunos bytes más que no lo hace.
Pruébalo en línea!
fuente
sqrt($1)
que pueda usar$1^.5
\n
para obtener la salida, el printf en awk no necesita paréntesis y la fórmula puede acortarses/2+$1/s/2
, lo que da como resultado{s=int($1^.5);printf"%.2f",s/2+$1/s/2}
. Lo siento si este comentario parece grosero.Raqueta , 92 bytes
Gracias a @JungHwan Min por el consejo en la sección de comentarios
Pruébalo en línea!
Sin golf
fuente
PowerShell , 54 bytes
Pruébalo en línea! o verificar algunos casos de prueba
Toma entrada
$x
y luego hace exactamente lo que se solicita. La|?
parte encuentra el número entero máximo que, cuando se eleva al cuadrado, es mayor-l
quee
la entrada$x
, luego realizamos los cálculos requeridos. La salida es implícita.fuente
Casco , 9 bytes
Pruébalo en línea!
Todavía hay algo feo en esta respuesta, pero parece que no puedo encontrar una solución más corta.
Explicación
Estoy implementando un paso del algoritmo de Newton (que de hecho es equivalente al propuesto en esta pregunta)
fuente
÷
Pyt ,
1110 bytesExplicación
fuente
Vía Láctea ,
1714 bytes-3 bytes usando la fórmula de Olivier Grégoire
Pruébalo en línea!
Explicación
fuente
C # (.NET Core) , 39 bytes
Pruébalo en línea!
Versión AC # de la respuesta Java de Olivier Grégoire .
fuente