숫자의 제곱근을 계산하십시오.


12

이 코드 골프의 목표는 입력으로 주어진 숫자의 제곱근을 계산하고 출력하는 프로그램 또는 함수를 만드는 것입니다.
규칙:

  • 외부 자원이 없음
  • 내장 큐브 루트 기능을 사용하지 않습니다.
  • 숫자를 거듭 제곱 할 수있는 방법 / 연산자 (제곱근, 제 4 근 등 포함)를 사용하지 않습니다.
  • 함수 / 프로그램은 부동 소수점 숫자와 음수를 입력으로 받아 들일 수 있어야합니다.
  • 큐브 근이 부동 소수점 숫자 인 경우 소수점 다음 4 자리로 반올림합니다.
  • 이것은 바이트 단위의 가장 짧은 코드가이기는 코드 골프입니다.

테스트 사례 :

27 --> 3
64 --> 4
1  --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7  --> 1.9129

위의 모든 테스트 사례를 사용하여 음수 ( -27 --> -3, -64 --> -4...) 를 테스트 할 수 있습니다.


젠장, 당신이 정확한 큐브와 숫자 만 허용한다면, 나는 좋은 골프를해야합니다
— 요 '

1
귀하의 테스트 사례로 판단하면 프로그램이 실수 만 처리해야한다고 생각합니까?
— user12205

@ace는 복잡한 것을 추가하고 코드에서 두 글자를 변경합니다.)
— yo '

2
소수점 다음 4 자리로 반올림하는 것이 강력한 요구 사항입니까? 아니면 "소수점 뒤에 4 자리 이상을 표시 할 필요가 없습니다"와 같은 것일 수 있습니까?
— Victor Stafusa

Exp (ln (x) / 3) (및 여러 복제본)를 사용하는 내 대답과 관련하여 Exp가 허용되는지 확인하십시오. 나는 pow (x, 1 / 3)가 (기술적으로 큐브 루트 함수는 아니지만) 그렇지 않다고 가정합니다.
— Level River St

답변:


6

J : 16 자

Haskell 답변의 느슨한 번역 :

-:@((%*~)+])^:_~

테스트 사례 :

   -:@((%*~)+])^:_~27
3
   -:@((%*~)+])^:_~64
4
   -:@((%*~)+])^:_~1
1
   -:@((%*~)+])^:_~18.609625
2.65
   -:@((%*~)+])^:_~3652264
154
   -:@((%*~)+])^:_~0.001
0.1
   -:@((%*~)+])^:_~7
1.91293

다음과 같이 작동합니다.

     (-:@((% *~) + ])^:_)~ 27
↔ 27 (-:@((% *~) + ])^:_) 27
↔ 27 (-:@((% *~) + ])^:_) 27 (-:@((% *~) + ])) 27
↔ 27 (-:@((% *~) + ])^:_) -: ((27 % 27 * 27) + 27)
↔ 27 (-:@((% *~) + ])^:_) 13.5185
↔ 27 (-:@((% *~) + ])^:_) 27 (-:@((% *~) + ])) 13.5185
↔ 27 (-:@((% *~) + ])^:_) -: ((27 % 13.5185 * 13.5185) + 13.5185)
↔ 27 (-:@((% *~) + ])^:_) 6.83313
...

한마디로 :

half =. -:
of =. @
divideBy =. %
times =. *
add =. +
right =. ]
iterate =. ^:
infinite =. _
fixpoint =. iterate infinite
by_self =. ~

-:@((%*~)+])^:_~ ↔ half of ((divideBy times by_self) add right) fixpoint by_self

~끝 이 뾰족한 포크와 오른쪽 이 있기 때문에 최고의 단어 번역이 아닙니다 .


19

하스켈-35

c n=(iterate(\x->(x+n/x/x)/2)n)!!99

예제 실행 :

c 27  =>  3.0
c 64  =>  4.0
c 1  =>  1.0
c 18.609625  =>  2.6500000000000004  # only first 4 digits are important, right?
c 3652264  =>  154.0
c 0.001  =>  0.1
c 7  =>  1.9129311827723892
c (-27)  =>  -3.0
c (-64)  =>  -4.0

또한 import하면 Data.Complex복잡한 숫자에서도 작동하며 숫자의 근 중 하나를 반환합니다 (3 개가 있음).

c (18:+26)  =>  3.0 :+ 1.0

:+연산자로 읽어야한다 '플러스 나는 배'


1
+1이 필요합니다. 지난 1 시간 동안 일반화 된 n 번째 루트 알고리즘을 리팩토링했으며, 이제 동일한 결과에 도달했습니다. 브라보.
— primo

@primo 나는 즉시 n 번째 근사 알고리즘을 모두 회상했으며 APL의 Taylor / Maclaurin 시리즈를 포기한 후에 이것을 사용했습니다.
— nini

내가 얻은 Newton 방법을 사용하면 x=(2*x+n/x/x)/3왜 사용할 수 있는지 설명 할 수 x=(x+n/x/x)/2있습니까? 느리게 수렴하지만 왜 수렴하는지 설명 할 수 없습니다 ...
— Michael M.

@Michael 당신이 가지고가는 경우 때문에 x=cbrt(n), 다음 x=(x+n/x/x)/2사실이다. 당신의 표현에 대해서도 마찬가지입니다
— mniip

@Michael 나는 이런 식으로 거기에 도착했다 : codepad.org/gwMWniZB
— primo

7

SageMath, (69) 62 바이트

그러나 그것이 결과를 줄 것이라고 믿지 마십시오. 모든 숫자를 무작위로 처리하는 것은 매우 어렵습니다.

def r(x):
 y=0
 while y*y*y-x:y=RR.random_element()
 return "%.4f"%y

잘림을 주장하지 않은 경우 :

def r(x):
 y=0
 while y*y*y-x:y=RR.random_element()
 return y

SageMath, 12 바이트 ( exp허용되는 경우 )

긍정, 부정, 제로, 복잡한 ...

exp(ln(x)/3)

숫자를 거듭 제곱 할 수있는 연산자를 사용하고 있다고 생각합니다.
— user12205

아 좋아, 오른쪽, 편집
— yo '

6
여전히 요구 사항을 충족시키는 기념비적 인 멍청한 알고리즘의 경우 +1입니다.
— 기계 달팽이

@Mechanicalsnail 감사합니다. 나는 내가하는 일이 일종의 불황이라는 것이 명백해지기를 바란다. D 그러나, 만약 exp허용 된다면 , 나는 12 세 이하로 멍청하지 않다. :)
— yo '

그것을 고려하면 exp"값이 함수는 상수 E 인 인수의 거듭 제곱 정수, 특히 함수이다."는 "지수 함수"의 약자 및 방법 / 운영자 소용 "없다고 숫자를 거듭 제곱 할 수 있습니다 " exp는 허용되지 않습니다.
— mbomb007

5

파이썬-62 바이트

x=v=input()
exec"x*=(2.*v+x*x*x)/(v+2*x*x*x or 1);"*99;print x

완전 부동 소수점 정밀도로 평가합니다. 사용 된 방법은 Halley 's method 입니다. 각 반복이 마지막 숫자보다 3 배 많은 올바른 자릿수를 생성하므로 99 개의 반복은 약간 과잉입니다.

입출력:

27 -> 3.0
64 -> 4.0
1 -> 1.0
18.609625 -> 2.65
3652264 -> 154.0
0.001 -> 0.1
7 -> 1.91293118277
0 -> 1.57772181044e-30
-2 -> -1.25992104989

어떻게 작동합니까?
— justhalf

1
@ justhalf 나는 이것이 뉴턴의 근사법이라고 생각합니다.
— yo '

Btw, 실패0
— yo '

에 실패했습니다 -2. 죄송합니다.
— yo '

3
@plg 문제 설명은 지수 함수의 사용을 금지합니다. 그렇지 않으면 v**(1/.3)확실한 승자가 될 것입니다.
— primo

3

자바 스크립트 (55)

function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}

보너스, 모든 뿌리에 대한 일반 제형
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}

큐브 루트, 바로 사용하기 위해 f(n,3), 제곱근 f(n,2):, 등등 ... 예 f(1024,10)돌아갑니다 2.

설명
뉴턴 방법을 기반으로 :

찾기 : f(x) = x^3 - n = 0해결책은 n = x^3
파생입니다.f'(x) = 3*x^2

반복 :
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2

테스트

[27,64,1,18.609625,3652264,0.001,7].forEach(function(n){console.log(n + ' (' + -n + ') => ' + f(n) + ' ('+ f(-n) +')')})

27 (-27) => 3 (-3)
64 (-64) => 4 (-4)
1 (-1) => 1 (-1)
18.609625 (-18.609625) => 2.65 (-2.65)
3652264 (-3652264) => 154 (-154)
0.001 (-0.001) => 0.09999999999999999 (-0.09999999999999999)
7 (-7) => 1.912931182772389 (-1.912931182772389) 

한 글자 더 짧은 :function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
— 복사

47 바이트로 줄일 수 있음f=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
— Luis felipe De jesus Munoz

2

PHP-81 바이트

반복 솔루션 :

$i=0;while(($y=abs($x=$argv[1]))-$i*$i*$i>1e-4)$i+=1e-5;@print $y/$x*round($i,4);

제곱근 제곱을 계산하려고하면 어떻게됩니까?
— Victor Stafusa

"0"만 출력됩니다 (오류 억제 연산자 덕분에 "@").
— Razvan

1
0.0001로 대체 될 수 1e-4및 0.00001의해 1e.5.
— ComFreek

PHP <7이 필요합니다 ( PHP 7에서 0/0제공 NAN). $i=0;불필요합니다 (-5 바이트. 그렇지 않은 경우 for1 바이트를 저장합니다). 공백 print은 필요하지 않습니다 (-1 바이트). -R로 3 바이트를 절약 할 수 있습니다 $argn.
— Titus

한 쌍의 패러 틴을 while(1e-4+$i*$i*$i<$y=abs($x=$argn))(-2 바이트)로 저장하십시오 .
— Titus

2

펄, 92 바이트

sub a{$x=1;while($d=($x-$_[0]/$x/$x)/3,abs$d>1e-9){$x-=$d}$_=sprintf'%.4f',$x;s/\.?0*$//;$_}
  • 이 함수 a는 불필요한 분수 부분이나 오른쪽 끝에 의미없는 0이없는 숫자가있는 문자열을 반환합니다.

결과:

              27 --> 3
             -27 --> -3
              64 --> 4
             -64 --> -4
               1 --> 1
              -1 --> -1
       18.609625 --> 2.65
      -18.609625 --> -2.65
         3652264 --> 154
        -3652264 --> -154
           0.001 --> 0.1
          -0.001 --> -0.1
               7 --> 1.9129
              -7 --> -1.9129
 0.0000000000002 --> 0.0001
-0.0000000000002 --> -0.0001
               0 --> 0
              -0 --> 0

에 의해 생성 된

sub test{
    my $a = shift;
    printf "%16s --> %s\n", $a, a($a);
    printf "%16s --> %s\n", "-$a", a(-$a);
}
test 27;
test 64;
test 1;
test 18.609625;
test 3652264;
test 0.001;
test 7;
test "0.0000000000002";
test 0;

계산은 뉴턴의 방법을 기반으로합니다 .

계산


2

APL-31

(×X)×+/1,(×\99⍴(⍟|X←⎕)÷3)÷×\⍳99

cbrt(x)=e^(ln(x)/3)순진한 ⋆지수화 대신 e^x테일러 / 매 클라 우린 계열을 사용하여 계산 한다는 사실을 사용합니다 .

샘플 실행 :

⎕: 27
3
⎕: 64
4
⎕: 1
1
⎕: 18.609625
2.65
⎕: 3652264
154
⎕: 0.001
0.1
⎕: 7
1.912931183
⎕: ¯27
¯3
⎕: ¯7
¯1.912931183

16 자로 된 J 답변 이 있다는 것을 알면 APL에서 정말 끔찍해야합니다 ...


2

자바 207 182 181

때로 골프를 타면 맥주가 두 개나 많아서 정말 나빠요

class n{public static void main(String[]a){double d=Double.valueOf(a[0]);double i=d;for(int j=0;j<99;j++)i=(d/(i*i)+(2.0*i))/3.0;System.out.println((double)Math.round(i*1e4)/1e4);}}

반복적 인 Newton의 근사법은 99 회 반복됩니다.

여기 골프가 없습니다 :

class n{
    public static void main(String a[]){
        //assuming the input value is the first parameter of the input
        //arguments as a String, get the Double value of it
        double d=Double.valueOf(a[0]);
        //Newton's method needs a guess at a starting point for the 
        //iterative approximation, there are much better ways at 
        //going about this, but this is by far the simplest. Given
        //the nature of the problem, it should suffice fine with 99 iterations
        double i=d;

        //make successive better approximations, do it 99 times
        for(int j=0;j<99;j++){
            i=( (d/(i*i)) + (2.0*i) ) / 3.0;
        }
        //print out the answer to standard out
        //also need to round off the double to meet the requirements
        //of the problem.  Short and sweet method of rounding:
        System.out.println( (double)Math.round(i*10000.0) / 10000.0 );
    }
}

1
args변수 이름을로 바꾸면 z6자가 줄어 듭니다. for- 루프의 몸체에서 공간과 중괄호를 제거하여 3자를 줄일 수 있습니다. 당신은 대체 할 수 10000.0에 의해 1e46 개 문자를 감소. 수업은 공개 할 필요가 없으므로 7자를 더 줄일 수 있습니다. 이렇게하면 185 자로 줄어 듭니다.
— Victor Stafusa

마지막에 캐스트가 정말로 필요한가요? 그것은 나를 위해하지 않습니다.
— Victor Stafusa

@Victor 좋은 눈으로 감사합니다. 10000.0 double에 E 표기법을 사용하는 것은 대단히 좋은 생각이었습니다. 질문의 디자인에 따르면,이 기능을 cli 클래스 대신 메소드로 만드는 것이 합법적이라고 생각합니다.이 클래스는 크기를 상당히 줄입니다. Java를 사용하면 기회가 없다고 생각하여 기능 측면에서 잘못되었습니다.
— md_rasler

CodeGolf에 오신 것을 환영합니다! 이것이 어떻게 작동하는지에 대한 해답을 추가하는 것을 잊지 마십시오!
— 저스틴

@Quincunx, 감사합니다. 권장 사항을 변경했습니다.
— md_rasler

2

TI 기본, 26 24 바이트

Input :1:For(I,1,9:2Ans/3+X/(3AnsAns:End

그것은 ^연산자를 직접 사용 하지 않습니다. 그것은 규칙에 의해 금지되어 있습니다
— mniip

@ mniip : e^TI-83 시리즈의 단일 연산자입니까? 기억이 안나요 어느 쪽이든, 그것은 규칙의 정신을 위반하고 있습니다.
— 기계 달팽이

@Mechanicalsnail 내가 말할 것이 중요하지 않습니다. 대부분의 언어에서 당신은 할 수 exp(ln(x)/3)또는 e^(ln(x/3))당신은이 두 가지 중 하나를 허용합니다. 그러나 어쨌든 나는 규칙에 의해 허용되는 것 exp(ln(x)/a)보다 너무 많은 것을 이해합니다 x^(1/a):-/
— yo '

지수 함수 "값이 함수는 상수 인수의 제곱 상수 전자이고, 특히 함수." ... "수를 거듭 제곱 할 수있는 방법 / 연산자를 사용하지 마십시오"
— mbomb007

catch @ mbomb007에 감사드립니다. 나는 3 년 전에이 답변을 썼으며,이를 준수하도록 수정하겠습니다.
— Timtech

2

JS 57 바이트

f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')

f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
document.getElementById('div').innerHTML += f(-27) + '<br>'
document.getElementById('div').innerHTML += f(-64) + '<br>'
document.getElementById('div').innerHTML += f(-1) + '<br>'
document.getElementById('div').innerHTML += f(-18.609625) + '<br>'
document.getElementById('div').innerHTML += f(-3652264) + '<br>'
document.getElementById('div').innerHTML += f(-0.001) + '<br>'
document.getElementById('div').innerHTML += f(-7) + '<br><hr>'
document.getElementById('div').innerHTML += f(27) + '<br>'
document.getElementById('div').innerHTML += f(64) + '<br>'
document.getElementById('div').innerHTML += f(1) + '<br>'
document.getElementById('div').innerHTML += f(18.609625) + '<br>'
document.getElementById('div').innerHTML += f(3652264) + '<br>'
document.getElementById('div').innerHTML += f(0.001) + '<br>'
document.getElementById('div').innerHTML += f(7) + '<br>'
<div id="div"></div>


2

자바 스크립트 : 73/72 자

이 알고리즘은 부적절하며이 질문은 소수점 다음 4 자리로 제한된다는 사실을 이용합니다. 그것은 질문을 재 작업하기 위해 샌드 박스에서 제안한 알고리즘의 수정 된 버전입니다. h*h*h<a4 자리 10 진수를 처리하는 곱셈과 나눗셈을 사용하여 0에서 무한까지 계산합니다 .

function g(a){if(a<0)return-g(-a);for(h=0;h*h*h<1e12*a;h++);return h/1e4}

4 년 후 편집 : Luis felipe De jesus Munoz가 제안한대로 **코드 를 사용 하면 코드가 짧아 지지만이 답변을 쓴 2014 년에는이 기능을 사용할 수 없었습니다. 어쨌든 그것을 사용함으로써 우리는 여분의 캐릭터를 면도합니다.

function g(a){if(a<0)return-g(-a);for(h=0;h**3<1e12*a;h++);return h/1e4}

1
대신 h*h*h당신이 할 수있는 h**31 바이트 저장
— 루이스 펠리페 드 예수님 무 노즈

@LuisfelipeDejesusMunoz이 답변은 2014 년입니다.이 **연산자는 2015 년에 제안되었으며 2016 년에 ECMAScript 7의 일부로 승인되었습니다 **.
— Victor Stafusa

1

자바 스크립트-157 자

이 기능 :

  • 음수를 처리하십시오.
  • 부동 소수점 숫자를 처리하십시오.
  • 모든 입력 번호에 대해 신속하게 실행하십시오.
  • 자바 스크립트 부동 소수점 숫자에 허용되는 최대 정밀도를 갖습니다.
function f(a){if(p=q=a<=1)return a<0?-f(-a):a==0|a==1?a:1/f(1/a);for(v=u=1;v*v*v<a;v*=2);while(u!=p|v!=q){p=u;q=v;k=(u+v)/2;if(k*k*k>a)v=k;else u=k}return u}

Ungolfed 설명 버전 :

function f(a) {
  if (p = q = a <= 1) return a < 0 ? -f(-a)      // if a < 0, it is the negative of the positive cube root.
                           : a == 0 | a == 1 ? a // if a is 0 or 1, its cube root is too.
                           : 1 / f (1 / a);      // if a < 1 (and a > 0) invert the number and return the inverse of the result.

  // Now, we only need to handle positive numbers > 1.

  // Start u and v with 1, and double v until it becomes a power of 2 greater than the given number.
  for (v = u = 1; v * v * v < a; v *= 2);

  // Bisects the u-v interval iteratively while u or v are changing, which means that we still did not reached the precision limit.
  // Use p and q to keep track of the last values of u and v so we are able to detect the change.
  while (u != p | v != q) {
    p = u;
    q = v;
    k = (u + v) / 2;
    if (k * k * k > a)
      v=k;
    else
      u=k
  }

  // At this point u <= cbrt(a) and v >= cbrt(a) and they are the closest that is possible to the true result that is possible using javascript-floating point precision.
  // If u == v then we have an exact cube root.
  // Return u because if u != v, u < cbrt(a), i.e. it is rounded towards zero.
  return u
}

1

PHP, 61

뉴턴의 방법을 기반으로합니다. 마이클의 대답의 약간 수정 된 버전 :

for($i=$x=1;$i++<99;)$x=(2*$x+$n/$x/$x)/3;echo round($x,14);

음수와 함께 작동하고 부동 소수점 숫자를 처리 할 수 ​​있으며 결과가 부동 소수점 숫자 인 경우 결과를 소수점 뒤 4 개의 숫자로 반올림합니다.

실무 데모


을 사용하여 2 바이트를 저장할 수 있습니다 for($x=1;++$i<100;).... 그러나 사전 정의 된 변수를 입력으로 사용하는 것은 일반적으로 눈살을 찌푸 립니다. 더 나은 사용 $argv[1]또는 $argn.
— Titus

1

Befunge 98-진행중인 작업

이 언어는 부동 소수점 숫자를 지원하지 않습니다. 이것은 그들을 모방하려고 시도합니다. 현재 0소수점 이후로 시작하지 않는 양수 (대부분)에서 작동합니다. 그러나 소수점 이하 2 자리 만 출력합니다.

&5ka5k*&+00pv
:::**00g`!jv>1+
/.'.,aa*%.@>1-:aa*

소수점 앞 부분을 입력하고을 곱한 100000다음 점 다음 부분을 입력하고 두 숫자를 더하여 작동합니다. 두 번째 줄은 큐브가 입력 된 숫자보다 클 때까지 카운터를 수행합니다. 그런 다음 세 번째 줄은 정수에서 10 진수를 추출합니다.

누구든지 왜 세 번째 줄 100이 올바른 값을 얻기 위해 나누는 지 말해 줄 수 있다면 알려주십시오.

IO :

27.0       3 .0
64.0       4 .0
1.0        1 .0
18.609625  2 .65
0.001      0 .1
7.0        1 .91

0.1        0 .1

1

스몰 토크, 37

크레디트는 알고리즘에 대한 니파이로 간다. 그의 코드의 스몰 토크 버전 :

n의 입력; x로 출력 :

1to:(x:=99)do:[:i|x:=2*x+(n/x/x)/3.0]

또는, 블록으로

[:n|1to:(x:=99)do:[:i|x:=2*x+(n/x/x)/3.0].x]

1

게임 메이커 언어, 51 바이트

for(i=x=1;i++<99;1)x=(2*x+argument0/x/x)/3;return x

0

하스켈 : 99C

영리하게 @mniip을 이길 수 없습니다. 방금 이진 검색을 했어요.

c x=d 0 x x
d l h x
 |abs(x-c)<=t=m
 |c < x=d m h x
 |True=d l m x
 where m=(l+h)/2;c=m*m*m;t=1e-4

언 골프 드 :

-- just calls the helper function below
cubeRoot x = cubeRoot' 0 x x

cubeRoot' lo hi x
    | abs(x-c) <= tol = mid           -- if our guess is within the tolerance, accept it
    | c < x = cubeRoot' mid hi x      -- shot too low, narrow our search space to upper end
    | otherwise = cubeRoot' lo mid x  -- shot too high, narrow search space to lower end
    where
        mid = (lo+hi)/2
        cubed = mid*mid*mid
        tol = 0.0001

d(와 같은 (l#h)x)에 대해 중위 연산자를 사용하여 각 호출에 대한 바이트를 저장할 수 있습니다 . c다음이됩니다 id>>=(0#).
— Esolanging Fruit

주변의 공백을 제거 할 수 있습니다 c < x.
— Esolanging Fruit

1>0대신 사용할 수 있습니다 True.
— Esolanging Fruit

0

J 28

*@[*(3%~+:@]+(%*~@]))^:_&|&1

Newtons 방법을 사용 x^3 - X하여 업데이트 단계 의 근본을 찾는 x - (x^3 - C)/(3*x^2)위치는 여기서 x는 현재 추측이고 C는 입력입니다. 이것에 대한 수학을하는 것은 우스꽝스럽게 간단한 표현을 산출합니다 (2*x+C/x^2) /3. 음수에주의를 기울여야합니다.

J에서 오른쪽에서 왼쪽으로 구현되었습니다.

  1. | 두 가지 주장을 모두 취하지 않고 전달하십시오.
  2. ^:_ 수렴까지
  3. (%*~@])은 C / x^2( *~ y와 동일 y * y)
  4. +:@] 이다 2 x
  5. 3%~3으로 나눕니다. 이것은 긍정적 인 뿌리를 산출
  6. *@[ * positive_root 양의 근에 C의 부호를 곱합니다.

시운전 :

   NB. give it a name:
   c=: *@[*(3%~+:@]+(%*~@]))^:_&|&1
   c 27 64 1 18.609625 3652264 0.001 7
3 4 1 2.65 154 0.1 1.91293

0

AWK, 53 바이트

{for(n=x=$1;y-x;){y=x;x=(2*x+n/x/x)/3}printf"%.4g",y}

사용법 예 :

$ awk '{for(n=x=$1;y-x;){y=x;x=(2*x+n/x/x)/3}printf"%.4g",y}' <<< 18.609625 
2.65$

JavaScript이것이 유래 한 솔루션 에 대해서는 @Mig에게 감사드립니다 . for루프가 변경을 중지하기 위해 반복이 필요 하다는 점을 감안하면 놀랍게도 빠르게 실행됩니다 .




0

자바 솔루션

공개 BigDecimal cubeRoot (BigDecimal 수) {

    if(number == null || number.intValue() == 0) return BigDecimal.ZERO;
    BigDecimal absNum = number.abs();
    BigDecimal t;
    BigDecimal root =  absNum.divide(BigDecimal.valueOf(3), MathContext.DECIMAL128);


    do {

        t = root;
        root = root.multiply(BigDecimal.valueOf(2))
                .add(absNum.divide(root.multiply(root), MathContext.DECIMAL128))
                .divide(BigDecimal.valueOf(3), MathContext.DECIMAL128);

    } while (t.toBigInteger().subtract(root.toBigInteger()).intValue() != 0);

    return root.multiply(number.divide(absNum), MathContext.DECIMAL128);
}

1
PPCG에 오신 것을 환영합니다! 이것은 코드 골프 챌린지입니다. 즉, 가능한 한 적은 코드 (소스 파일의 바이트 단위로 계산)를 해결하는 것이 목표입니다. 해당 목표에 맞게 솔루션을 최적화하기위한 노력을 보여주고 바이트 수를 답에 포함시켜야합니다.
— 마틴 엔더

0

파이썬 솔루션

def cube_root(num):
    if num == 0:
        return 0

    t = 0
    absNum = abs(num)
    root = absNum/3

    while (t - root) != 0:
        t = root
        root = (1/3) * ((2 * root) + absNum/(root * root))

    return root * (num / absNum)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.