Antecedentes
Las medias metálicas , comenzando con la famosa media dorada , se definen para cada número natural (entero positivo), y cada una es una constante irracional (tiene una expansión decimal infinita no recurrente).
Para un número natural , la
media metálica es la raíz de una ecuación cuadrática
Las raíces son siempre
pero la media metálica generalmente se da como la raíz positiva. Entonces, para esta pregunta, se definirá por:
Para el resultado es la famosa proporción áurea:
Desafío
Su código debe tomar 2 entradas: n y p (el orden no es importante siempre que sea consistente)
- n es un número natural que indica qué media metálica
- p es un número natural que indica cuántos decimales de precisión
Su código debe generar la enésima media metálica con precisión de decimales p.
Validez
Su código es válido si funciona para valores de n y p de 1 a 65.535.
Debe generar un decimal en la forma
dígito (s) .digito (s) (sin espacios)
Por ejemplo, la media dorada a 9 decimales es
1.618033988
Muestra el último dígito sin redondear, ya que aparecería en una expansión decimal más larga. El siguiente dígito en la media dorada es un 7, pero el 8 final en el ejemplo no debe redondearse a un 9.
El número de dígitos decimales debe ser p, lo que significa que también se deben incluir los ceros finales.
Respuestas del formulario
no son válidos: debe usar una expansión decimal.
Puede generar hasta 1 nueva línea inicial y hasta 1 nueva línea final. No puede generar espacios ni ningún otro carácter además de los dígitos y el punto único / punto final / punto.
Puntuación
Este es el código estándar de golf: su puntaje es el número de bytes en su código.
Tabla de clasificación
(Usando el fragmento de la tabla de clasificación de Martin )
R, 116 bytes
Esto lee dos enteros de STDIN e imprime el resultado en STDOUT. Puedes probarlo en línea .
Ungolfed + explicación:
Si no tiene la
Rmpfr
biblioteca instalada, puede hacerloinstall.packages("Rmpfr")
y todos sus sueños se harán realidad.fuente
Mathematica, 50 bytes
Define una función anónima que toma
n
yp
en orden. UtilizoFloor
para evitar el redondeoSetAccuracy
, que necesito para obtener una salida decimal.fuente
p>15
.CJam, 35 bytes
Lee p primero, luego n .
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
Simplemente calculamos la fórmula de la pregunta para n × 10 p , obtenemos el número entero y la parte fraccional del resultado dividido por 10 p , rellenamos la parte fraccional con ceros a la izquierda para obtener dígitos p e imprimimos las partes separadas por un punto.
fuente
Python 2, 92 bytes
Como ahora estoy mirando las respuestas, parece que la respuesta de CJam usa el mismo método básico que este. Calcula la respuesta para
n*10**p
y luego agrega el punto decimal. Es increíblemente ineficiente debido a la forma en que calcula la parte entera de la raíz cuadrada (solo sumando 1 hasta que llegue allí).fuente
PHP,
8578 bytesUtiliza la extensión matemática BC Math que, en algunos sistemas, podría no estar disponible. Debe incluirse en el tiempo de compilación especificando la
--enable-bcmath
opción de línea de comando. Siempre está disponible en Windows y parece que también está incluido en la versión de PHP incluida con OSX.Actualización :
Apliqué todos los hacks sugeridos por @blackhole en sus comentarios (¡gracias!) Luego exprimí la inicialización
$n
en su primer uso (3 bytes más guardados) y ahora el código cabe en una sola línea en el cuadro de código anterior.fuente
echo
, solo deje un espacio después.bcscale
regresartrue
, puede usar$n=$argv[bcscale($argv[2])];
y guardar 2 bytes más.bcpow($n,2)
lugar debcmul($n,$n)
ahorra 1 byte.J, 27 bytes
Explicación:
Llámalo así:
Otra solución un poco más fría:
Que calcula las raíces del polinomio x ^ 2 - nx - 1. Desafortunadamente, la forma en que J formatea el resultado hace que retomar la raíz deseada un poco más.
fuente