Inspirado neste vídeo por tecmath .
Para obter uma aproximação da raiz quadrada de qualquer número x
, pegue a raiz quadrada inteira s
(ou seja, o maior número inteiro que s * s ≤ x
) e faça o cálculo s + (x - s^2) / (2 * s)
. Vamos chamar essa aproximação S(x)
. (Nota: isso é equivalente à aplicação de uma etapa do método Newton-Raphson).
Embora isso tenha uma peculiaridade, onde S (n ^ 2 - 1) sempre será √ (n ^ 2), mas geralmente será muito preciso. Em alguns casos maiores, isso pode ter uma precisão> 99,99%.
Entrada e saída
Você receberá um número em qualquer formato conveniente.
Exemplos
Formato: Entrada -> Saída
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
Especificações
Sua saída deve ser arredondada para pelo menos a centésima mais próxima (ou seja, se a resposta for 47,2851, você pode gerar 47,29)
Sua saída não precisa ter os seguintes zeros e um ponto decimal se a resposta for um número inteiro (por exemplo, 125,00 também pode ser emitido como 125 e 125,0)
Você não precisa suportar números abaixo de 1.
Você não precisa oferecer suporte a entradas não inteiras. (ou seja, 1,52 etc ...)
Regras
As brechas padrão são proibidas.
Este é um código-golf , pelo que a resposta mais curta em bytes vence.
fonte
s + (x - s^2) / (2 * s) == (x + s^2) / (2 * s)
Respostas:
Geléia ,
87 bytes-1 byte graças à fórmula matemática simplificada de Olivier Grégoire - veja a resposta em Java .
Experimente online!
Como?
fonte
÷ƽ+ƽH
Primeira vez tentando usar o Jelly, para que eu possa estar errado. Eu gostaria de saber como armazenarƽ
, no entanto, para não repeti-lo. Isso pode salvar outro byte.ƽɓ÷⁹+H
não recalcula a raiz inteira, mas também 7.ɓ
inicia uma nova cadeia diádica com argumentos trocados e depois⁹
se refere ao argumento correto dessa cadeia (ou seja, o resultado deƽ
).ƽɓ÷+⁹H
trabalharia aqui também.Haskell , 34 bytes
Experimente online!
Explicação no pseudocódigo imperativo:
fonte
Java (OpenJDK 8) , 32 bytes
Experimente online!
Explicações
O código é equivalente a isso:
A matemática por trás:
fonte
Python 2 ,
47... 36 bytes-3 bytes graças a @JungHwanMin
-1 byte graças a @HyperNeutrino
-2 bytes graças a @JonathanFrech
-3 bytes graças a @ OlivierGrégoire
Experimente online!
fonte
s+(x-s*s)/s/2
para(x+s*s)/s/2
+.0
e substituir/s/2
por/2./s
, salvando dois bytes?MATL ,
129 bytesExperimente online!
fonte
R,
43 bytes29 bytesGraças a @ Giuseppe pela nova equação e ajuda no golfe de 12 bytes com a solução de divisão inteira. Ao trocar a chamada de função para a verificação, joguei mais alguns bytes.
Experimente online!
fonte
f <-
para atribuir a função. Mas, ainda assim, boa solução, leia Dicas para jogar golfe no R quando tiver chance!APL (Dyalog) ,
2016 bytesExperimente online!
fonte
JavaScript (ES7), 22 bytes
Nós realmente não precisamos de uma variável intermediária, portanto, isso pode ser reescrito como:
Casos de teste
Mostrar snippet de código
fonte
C, 34 bytes
Obrigado a @Olivier Grégoire!
Funciona apenas com
float
entradas.Experimente online!
C,
413937 bytesExperimente online!
C,
49474543 bytesExperimente online!
Obrigado a @JungHwan Min por salvar dois bytes!
fonte
Haskell , 40 bytes
Outro bytes a poeira, graças a H.PWiz.
Experimente online!
fonte
AWK ,
47 4438 bytesExperimente online!
NOTA: O TIO like possui 2 bytes extras para
\n
tornar a saída mais bonita. :)Parece um pouco trapaceiro usar o sqrt para encontrar a raiz quadrada, então aqui está uma versão com mais alguns bytes que não.
Experimente online!
fonte
sqrt($1)
você pode usar$1^.5
\n
obter a saída, o printf no awk não precisa de parênteses e a fórmula pode ser reduzidas/2+$1/s/2
, o que resulta em{s=int($1^.5);printf"%.2f",s/2+$1/s/2}
. Desculpe se este comentário parece rude.Raquete , 92 bytes
Obrigado a @JungHwan Min pela dica na seção de comentários
Experimente online!
Ungolfed
fonte
PowerShell , 54 bytes
Experimente online!ou Verifique alguns casos de teste
Recebe entrada
$x
e, em seguida, faz exatamente o que é solicitado. A|?
parte encontra o máximo inteiro que, quando quadrados, é-l
ess-que-ou-e
qua para a entrada$x
, em seguida, realizamos os cálculos necessários. A saída está implícita.fonte
Casca , 9 bytes
Experimente online!
Ainda há algo feio nessa resposta, mas não consigo encontrar uma solução mais curta.
Explicação
Estou implementando uma etapa do algoritmo de Newton (que é de fato equivalente à proposta nesta pergunta)
fonte
÷
Pyt ,
1110 bytesExplicação
fonte
Via Láctea ,
1714 bytes-3 bytes usando a fórmula de Olivier Grégoire
Experimente online!
Explicação
fonte
C # (.NET Core) , 39 bytes
Experimente online!
Versão AC # da resposta Java de Olivier Grégoire .
fonte