Quantas casas decimais existem antes de eu precisar adicionar 1 ao arredondar?

10

Quando você arredondar um número, se o próximo dígito for >= 5adicionar 1. Por exemplo:

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

O seu desafio é receber um número inteiro como entrada e gerar o número de casas decimais antes do qual você teria que arredondar a raiz quadrada do número - ou seja, o número de casas decimais antes de >= 5ocorrer um dígito .

O número inteiro estará entre 0 e 100.000, inclusive, portanto, para o caso de margem de 59752, você precisa suportar 17 pontos decimais (para verificar o dia 17).

Se a linguagem de programação não puder alterar o número de pontos decimais, você poderá exibir um "?" mensagem para o usuário.

Exemplo:

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)

Faça o que quiser em quadrados perfeitos.

Isso é então o código mais curto vence.


Para qualquer pessoa interessada, o número 310.617 é o maior abaixo de 1.000.000 e tem 18 antes de você chegar a um dígito >= 5.

Tim
fonte
Quantas casas decimais precisamos suportar no máximo? - Nenhum idioma armazena com precisão infinita.
Azul
Não sei por que, mas recebo 17 dígitos para o SQRT (59752) (em dois idiomas diferentes). Os outros resultados saem corretamente.
Jonathan Leech-Pepin
@ JonathanLeech-Pepin, você está incluindo o último dígito por algum motivo? ou o seu programa não suporta casas decimais suficientes.
Tim
Ele nunca tem um dígito maior que 5. Meu programa, por exemplo, será encerrado com -1
Blue
@muddyfish tudo bem.
Tim

Respostas:

2

Pitão, 13 bytes

f<5e@=*QC\d2Z

Suíte de teste

Comece com Qigual à entrada. Em cada etapa do tempo, multiplique Qpor 100, calculado como chr('d'). Pegue sua raiz quadrada. Faça este mod 10. Se o resultado for maior que 5, encerre. Imprima o número de iterações necessárias para finalizar, indexadas em 0.

Em detalhe:

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
fonte
1

CJam, 29 26 28 bytes

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

Experimente online.

Coloca um "?" se o número não aparecer, pode ser arredondado (quadrado perfeito ou muito longo).

geokavel
fonte
1

Pitão, 22 bytes

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

Explicação

                       - 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

Estou absolutamente certo de que isso pode ser jogado. Se a entrada não tiver um dígito maior que 4, ela imprimirá -1. Suporta 17dp.

Azul
fonte
1

Javascript, 59 bytes

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

Retorna ?para 59752 porque o JavaScript usa apenas precisão dupla.

Neil
fonte
1

Shell do Linux, 52 bytes

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

Eu tentei uma dcsolução pura , mas falhei. A precisão é ajustável (primeiro número).

Como o OP especifica gentilmente que "você pode fazer o que quiser em quadrados perfeitos", nesse caso, esta solução gera a precisão + 1, neste caso 35.

Félix Saparelli
fonte
1

Mathematica 60 bytes

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

Exemplo

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

16

DavidC
fonte
Você pode remover o espaço em branco ao redor do Apply.
LegionMammal978
Obrigado. A contagem de bytes permanece a mesma porque eu não havia contado esses espaços.
DavidC
-2

Ruby, 46 bytes

Isso pode não ser válido, pois cabe apenas 16 dígitos.

p (gets.to_i**0.5).to_s.split('.')[1]=~/[5-9]/
MegaTom
fonte
Qual é a saída em 59752?
Tim
nil, como nenhum dígito após 4 está na sequência inteira. Pode depender da versão ruby.
MegaTom 6/11
Ele precisa de apoio 59752 - por isso precisa 17 dps
Tim