O objetivo deste código golf é criar um programa ou função que calcule e produza a raiz do cubo de um número que é fornecido como entrada.
As regras:
- Nenhum recurso externo
- Nenhum uso de funções raiz do cubo interno.
- Nenhum uso de métodos / operadores que podem elevar um número a uma potência (que inclui raiz quadrada, quarta raiz, etc.).
- Sua função / programa deve poder aceitar números de ponto flutuante e números negativos como entrada.
- Se a raiz do cubo for um número de ponto flutuante, arredonde-o para 4 números após o ponto decimal.
- Este é um código de golfe, o código mais curto em bytes vence.
Casos de teste:
27 --> 3
64 --> 4
1 --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7 --> 1.9129
Você pode usar todos os casos de teste acima para testar números negativos ( -27 --> -3
, -64 --> -4
...)
Respostas:
J: 16 caracteres
Tradução solta da resposta Haskell:
Casos de teste:
Funciona assim:
Em palavras:
Não é uma das melhores traduções verbais, já que há um garfo diádico e o
~
direito no final.fonte
Haskell - 35
Exemplo é executado:
Além disso, se você importar
Data.Complex
, ele funciona em números complexos, mas retorna uma das raízes do número (existem 3):O
:+
operador deve ser lido como 'mais i vezes'fonte
x=(2*x+n/x/x)/3
, você pode explicar por que pode usarx=(x+n/x/x)/2
? Ela converge mais lento, mas eu não posso explicar por que converge ...x=cbrt(n)
, entãox=(x+n/x/x)/2
é verdade. Então é verdade para sua expressãoSageMath, (69) 62 bytes
No entanto, nunca acredite que isso lhe dará o resultado, é muito difícil analisar aleatoriamente todos os números:
se você não insistiu em truncar:
SageMath, 12 bytes, se
exp
for permitidoFunciona para todas as coisas: positivo, negativo, zero, complexo, ...
fonte
exp
for permitido, tenho menos de 12 anos e não sou idiota :)exp
é a abreviação de "função exponencial", que é "uma função cujo valor é uma constante aumentada para o poder do argumento, especialmente a função em que a constante é e." E não há "nenhum uso de métodos / operadores que pode elevar um número a uma potência ",exp
não é permitido.Python - 62 bytes
Avalia com precisão total de ponto flutuante. O método usado é o método de Halley . Como cada iteração produz três vezes mais dígitos corretos que a anterior, 99 iterações são um pouco exageradas.
Entrada / saída:
fonte
0
-2
, desculpe por isso.v**(1/.3)
seria um vencedor.Javascript (55)
function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}
BÔNUS, Formulação geral para todas as raízes
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}
Para raiz do cubo, basta usar
f(n,3)
, raiz quadradaf(n,2)
, etc ... Exemplo:f(1024,10)
retorna2
.Explicação
Com base no método de Newton:
Encontre:,
f(x) = x^3 - n = 0
a solução én = x^3
A derivação:
f'(x) = 3*x^2
Iterar:
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2
Testes
fonte
function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
f=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
PHP - 81 bytes
Solução iterativa:
fonte
0.0001
pode ser substituído por1e-4
e0.00001
por1e.5
.0/0
fornecidoNAN
no PHP 7).$i=0;
é desnecessário (-5 bytes. Se nãofor
fosse , economizaria um byte.) O espaço apósprint
não é necessário (-1 byte).-R
pode salvar 3 bytes com$argn
.while(1e-4+$i*$i*$i<$y=abs($x=$argn))
(-2 bytes).Perl, 92 bytes
a
retorna uma string com o número sem uma parte de fração desnecessária ou zeros insignificantes na extremidade direita.Resultado:
Gerado por
O cálculo é baseado no método de Newton :
fonte
APL - 31
Usa o fato de que
cbrt(x)=e^(ln(x)/3)
, mas em vez de fazer⋆
exponenciação ingênua , calculae^x
usando a série Taylor / Maclaurin.Amostras de execuções:
Visto que há uma resposta J em 16 caracteres, devo ser realmente terrível na APL ...
fonte
Java,
207182181Às vezes, quando jogo golfe, tomo duas cervejas e jogo muito mal
O método iterativo de aproximação de Newton, executa 99 iterações.
Aqui está o unGolfed:
fonte
args
variável para algo comoz
, reduzindo 6 caracteres. Você pode remover o espaço e as chaves no corpo do loop for, reduzindo 3 caracteres. Você pode substituir10000.0
por1e4
, reduzindo 6 caracteres. A classe não precisa ser pública, para que você possa reduzir mais 7 caracteres. Dessa forma, será reduzido para 185 caracteres.TI-Basic,
2624 bytesfonte
^
operador, não é? É proibido pelas regrase^
um único operador na série TI-83? Não me lembro. De qualquer maneira, está violando o espírito das regras.exp(ln(x)/3)
oue^(ln(x/3))
se você permitir um desses dois. Mas de alguma forma eu entendoexp(ln(x)/a)
como equivalente demaisx^(1/a)
para ser permitido pelas regras: - /Js 57 bytes
f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
fonte
Javascript: 73/72 caracteres
Esse algoritmo é coxo e explora o fato de que essa pergunta é limitada a 4 dígitos após o ponto decimal. É uma versão modificada do algoritmo que sugeri na sandbox com o objetivo de refazer a pergunta. Ele conta de zero a infinito enquanto
h*h*h<a
, apenas com um truque de multiplicação e divisão para lidar com a pecisão de 4 dígitos decimais.Editar, 4 anos depois: Conforme sugerido por Luis felipe De jesus Munoz, o uso
**
do código é mais curto, mas esse recurso não estava disponível em 2014 quando escrevi esta resposta. De qualquer forma, ao usá-lo, raspamos um caractere extra:fonte
h*h*h
você pode fazerh**3
e salvar 1 byte**
operador foi proposto em 2015 e foi aceito como parte do ECMAScript 7 em 2016. Então, na época em que escrevi isso, não havia nenhum**
idioma.Javascript - 157 caracteres
Esta função:
Versão explicada ungolfed:
fonte
PHP, 61
Baseado no método de Newton. Versão ligeiramente modificada da resposta de Michael :
Funciona com números negativos, pode lidar com números de ponto flutuante e arredonda o resultado para 4 números após o ponto decimal, se o resultado for um número de ponto flutuante.
Demonstração de trabalho
fonte
for($x=1;++$i<100;)...
. Mas o uso de variáveis predefinidas como entrada geralmente é desaprovado . Melhor uso$argv[1]
ou$argn
.Befunge 98 - Trabalhos em andamento
Este idioma não suporta números de ponto flutuante; isso tenta imitá-los. Atualmente, ele funciona para números positivos que não iniciam
0
após o ponto decimal (principalmente). No entanto, ele gera apenas 2 casas decimais.Ele funciona inserindo a parte antes do ponto decimal, multiplicando-o por
100000
, inserindo a parte após o ponto e adicionando os dois números. A segunda linha faz um contador até que o cubo seja maior que o número inserido. Em seguida, a terceira linha extrai o número decimal do número inteiro.Se alguém puder me dizer por que a terceira linha se divide apenas
100
para obter os valores corretos, diga-me.IOs:
fonte
Smalltalk, 37
o crédito vai para o mniip para o algoritmo; Versão Smalltalk do seu código:
entrada em n; saída em x:
ou, como um bloco
fonte
Idioma do GameMaker, 51 bytes
fonte
Haskell: 99C
Não pode vencer @mniip com esperteza. Eu apenas fui com uma pesquisa binária.
Ungolfed:
fonte
d
(como(l#h)x
) salvar um byte para cada chamada.c
então se tornaid>>=(0#)
.c < x
.1>0
vez deTrue
.J 28
Usando o método Newtons, encontrar a raiz da
x^3 - X
etapa de atualização éx - (x^3 - C)/(3*x^2)
, onde x é a suposição atual e C a entrada. Fazer as matemáticas nesse caso produz a expressão ridiculamente simples de(2*x+C/x^2) /3
. É preciso ter cuidado com números negativos.Implementado em J, da direita para a esquerda:
|
Tome abs dos dois argumentos, passe-os adiante^:_
Faça até convergência(%*~@])
éC / x^2
(*~ y
é equivalente ay * y
)+:@]
é2 x
3%~
divida por três. Isso produz a raiz positiva*@[ * positive_root
multiplica raiz positiva com o sinal de C.Execução de teste:
fonte
AWK, 53 bytes
Exemplo de uso:
Agradecemos a @Mig pela
JavaScript
solução da qual isso é derivado. É executado surpreendentemente rapidamente, uma vez que ofor
loop requer que a iteração pare de mudar.fonte
C, 69 bytes
Apenas mais uma implementação do método de Newton. Experimente online!
fonte
Stax , 10 bytes CP437
Execute e depure online!
Explicação
Usa a versão descompactada para explicar.
fonte
Solução JAVA
public BigDecimal cubeRoot (número BigDecimal) {
fonte
Solução Python
fonte