¿Cuántos decimales hay antes de que necesite agregar 1 al redondear?

10

Cuando redondea un número, si el siguiente dígito es >= 5usted agrega 1. Por ejemplo:

3.1415926535 rounded to 1dp is 3.1
3.1415926535 rounded to 4dp is 3.1416    <-- Note the 5 changed to 6
3.1415926535 rounded to 5dp is 3.14159

3.1415926535 rounded to 9dp is 3.141592654  <-- Note the 3 changed to 4

Su desafío es recibir un número entero como entrada y salida el número de lugares decimales antes de los cuales tendría que redondear la raíz cuadrada del número, es decir, el número de lugares decimales antes de un dígito que se >= 5produce.

El número entero estará entre 0 y 100,000 inclusive, por lo que para el caso límite de 59752 debe admitir 17 puntos decimales (para verificar el 17).

Si su lenguaje de programación no puede cambiar el número de puntos decimales, puede mostrar un "?" mensaje al usuario.

Ejemplo:

Input    Root                     Output

    5 -> 2.23 606797749979     -> 2
   41 -> 6.40312423 743284     -> 8      (Largest gap under 100)
  596 -> 24.4131112314 674     -> 10     (Largest gap under 1000)
59752 -> 244.44222221212112029 -> 16     (Largest gap under 100000)

Haz lo que quieras en cuadrados perfectos.

Este es el por lo que gana el código más corto.


Para cualquier persona interesada, el número 310,617 es el más grande por debajo de 1,000,000 y tiene 18 antes de llegar a un dígito >= 5.

Tim
fuente
¿Cuántos decimales necesitamos admitir al máximo? - No hay idiomas almacenados con una precisión infinita.
Azul
No sé por qué, pero obtengo 17 dígitos para SQRT (59752) (en dos idiomas diferentes). Los otros resultados salen correctamente.
Jonathan Leech-Pepin el
@ JonathanLeech-Pepin, ¿está incluyendo el último dígito por alguna razón? o su programa no admite suficientes decimales.
Tim
Nunca tiene un dígito mayor que 5. Mi programa, por ejemplo, saldrá con -1
Azul
@muddyfish está bien.
Tim

Respuestas:

2

Pyth, 13 bytes

f<5e@=*QC\d2Z

Banco de pruebas

Comience con Qigual a la entrada. En cada paso de tiempo, multiplique Qpor 100, calculado como chr('d'). Toma su raíz cuadrada. Tome este mod 10. Si el resultado es mayor que5 , finalice. Imprima el número de iteraciones que se necesitaron para terminar, indexado en 0.

En detalle:

f<5e@=*QC\d2Z
                   Q = eval(input())
f           Z      Filter for the first truthy result over the infinite sequence
                   starting at Z (= 0)
     =*Q           Q *=
        C\d             chr('d') (= 100)
                   ---------------------
    @  Q   2          Q ^ (1/2)
   e                            % 10
 <5               5 <
isaacg
fuente
1

CJam, 29 26 28 bytes

rimqs_'.+'.#)>{'5<}%0#]W'?er

Pruébalo en línea.

Pone un "?" si no aparece el número que puede redondearse (cuadrado perfecto o demasiado largo).

geokavel
fuente
1

Pyth, 22 bytes

J`%@Q2 1x.e<\4@Jbr2lJ1

Explicación

                       - Autoassign Q to evaluated input
   @Q2                 - Get the square root of Q
J`%    1               - Get the stuff after the decimal point and put it in a string. Store in J
         .e      r2lJ  - Create a range between 2 and the length of the string (forget about the 0. bit) and enumerate over it
              @Jb      - Get the current decimal place
           <\4         - Is it bigger than 4
        x            1 - Find the position of the first True value

Estoy absolutamente seguro de que esto se puede jugar al golf. Si la entrada no tiene un dígito mayor que 4, imprimirá -1. Soporta 17dp.

Azul
fuente
1

Javascript, 59 bytes

f=a=>(a=/\.(.*?)[5-9]/.exec(Math.sqrt(a)),a?a[1].length:'?')

Devuelve ?59752 porque JavaScript solo usa doble precisión.

Neil
fuente
1

Shell de Linux, 52 bytes

dc -e'34k?vp'|cut -d. -f2|sed 's/.[5-9\s].*//'|wc -m

Intenté una dcsolución pura , pero fallé. La precisión es ajustable (primer número).

Como el OP especifica amablemente que "puedes hacer lo que quieras en cuadrados perfectos", en este caso, esta solución genera la precisión + 1, en este caso 35.

Félix Saparelli
fuente
1

Mathematica 60 bytes

(Position[Drop@@RealDigits[N[Sqrt@#,99]],x_/;x>4][[1,1]]-1)&

Ejemplo

(Position[Drop@@RealDigits[N[Sqrt@#, 99]], x_ /; x > 4][[1, 1]] - 1) &[59752]

dieciséis

DavidC
fuente
Puede eliminar el espacio en blanco alrededor del Apply.
LegionMammal978
Gracias. El recuento de bytes permanece igual porque no había contado esos espacios.
DavidC
-2

Rubí, 46 bytes

Esto puede no ser válido, ya que solo se ajusta a 16 dígitos.

p (gets.to_i**0.5).to_s.split('.')[1]=~/[5-9]/
MegaTom
fuente
¿Cuál es la salida en 59752?
Tim
nil, ya que ningún dígito pasado 4 está en toda la cadena. Puede depender de la versión ruby.
MegaTom
Debe admitir 59752, por lo que necesita 17 dps
Tim