대략적인 내 사각형


10

영감을받은 이 비디오 에 의해 tecmath .

어떤 수의 제곱근의 근사값은 x정수 제곱근 복용하여 찾을 수 있습니다 s(즉, 그러한 정수 최대 s * s ≤ x)를 계산 한 후와 s + (x - s^2) / (2 * s). 이 근사를 호출하자 S(x). (참고 : 이것은 Newton-Raphson 방법의 한 단계를 적용하는 것과 같습니다).

이것은 기발한 것이 있지만 S (n ^ 2-1)은 항상 √ (n ^ 2)이지만 일반적으로 매우 정확합니다. 더 큰 경우에는 99.99 % 이상의 정확도를 가질 수 있습니다.

입력과 출력

편리한 형식으로 하나의 숫자를 사용합니다.

형식 : 입력-> 출력

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

명세서

  • 출력은 최소한 가장 가까운 100 분의 1로 반올림되어야합니다 (예 : 답이 47.2851 인 경우 47.29를 출력 할 수 있음)

  • 답이 정수이면 출력에 다음과 같은 0과 소수점이 없어도됩니다 (예 : 125.00도 125와 125.0으로 출력 가능)

  • 1 미만의 숫자는 지원하지 않아도됩니다.

  • 정수가 아닌 입력을 지원하지 않아도됩니다. (즉, 1.52 등 ...)

규칙

표준 허점 은 금지되어 있습니다.

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.



3
참고 :s + (x - s^2) / (2 * s) == (x + s^2) / (2 * s)
JungHwan Min

내 솔루션 : Pyth , 25 bytes ; 14 바이트
Stan Strum

최소 2 자리까지 정확해야합니까?
완전히 인간적인

@totallyhuman 예. 47.2851은 47.28로 표시 될 수 있지만 더 이상 정확하지 않습니다.
Stan Strum

답변:


2

젤리 ,  8  7 바이트

Olivier Grégoire의 단순화 된 수학 공식 덕분에 -1 바이트 덕분에 Java 답변을 참조하십시오 .

÷ƽ+ƽH

온라인으로 사용해보십시오!

어떻게?

÷ƽ+ƽH - Link: number, n
 ƽ     - integer square root of n  -> s
÷       - divide                    -> n / s
    ƽ  - integer square root of n  -> s
   +    - add                       -> n / s + s
      H - halve                     -> (n / s + s) / 2

7 바이트 : ÷ƽ+ƽH젤리를 처음 사용하려고하면 잘못되었을 수 있습니다. ƽ그래도 저장 하지 않는 방법을 알고 싶습니다 . 다른 바이트를 절약 할 수 있습니다.
Olivier Grégoire

감사합니다 @ OlivierGrégoire! ƽɓ÷⁹+H정수 루트를 다시 계산하지는 않지만 7 ɓ입니다. 교체 된 인수를 사용하여 새 2 차원 체인을 시작한 다음 해당 체인의 올바른 인수 (예 :의 결과 ƽ)를 나타냅니다. ƽɓ÷+⁹H여기에서도 작동합니다.
Jonathan Allan


4

Java (OpenJDK 8) , 32 바이트

n->(n/(n=(int)Math.sqrt(n))+n)/2

온라인으로 사용해보십시오!

설명

코드는 다음과 같습니다.

double approx_sqrt(double x) {
  double s = (int)Math.sqrt(x);  // assign the root integer to s
  return (x / s + s) / 2
}

뒤에 수학 :

s + (x - s²) / (2 * s)  =  (2 * s² + x - s²) / (2 * s)
                        =  (x + s²) / (2 * s)
                        =  (x + s²) / s / 2
                        =  ((x + s²) / s) / 2
                        =  (x / s + s² / s) / 2
                        =  (x / s + s) / 2

이것은 사양을 다루지 않는 것 같습니다 : 출력은 최소한 가장 가까운 100 분의 1로 반올림되어야합니다
Ayb4btu

2
음, 가장 가까운 100 분의 1보다 작게 반올림되므로 완전히 유효합니다.
Olivier Grégoire

아, 알 겠어 내 오해
Ayb4btu

4

파이썬 2 , 47 ... 36 바이트

@JungHwanMin 덕분에 -3 바이트 @HyperNeutrino 덕분에
-1 바이트 @JonathanFrech 덕분에
-2 바이트
@ OlivierGrégoire 덕분에 -3 바이트

def f(x):s=int(x**.5);print(x/s+s)/2

온라인으로 사용해보십시오!


-2 bytes : s+(x-s*s)/s/2to(x+s*s)/s/2
JungHwan Min

함수를 사용한 -2 바이트
HyperNeutrino

@HyperNeutrino 난 단지 -1 바이트를
ovs

오, 죄송합니다. 테스트 후 실수로 문자를 삭제 한 후 바이트 수를 세었습니다. 예 -1
HyperNeutrino

당신은 생략 할 수 없습니다 +.0및 교체 /s/2와 함께 /2./s2 바이트를 저장?
Jonathan Frech


3

R, 43 바이트 29 바이트

x=scan()
(x/(s=x^.5%/%1)+s)/2

새로운 방정식을위한 @Giuseppe에게 정수 나누기 솔루션으로 12 바이트의 골프를 돕습니다. 스캔을위한 함수 호출을 교체함으로써, 나는 또 다른 몇 바이트를 골랐다.

온라인으로 사용해보십시오!


1
35 바이트 ; 보다 일반적으로 TIO의 "header"필드를 사용 f <- 하여 기능을 할당 할 수 있습니다. 그러나 여전히 좋은 해결책 은 기회가되었을 때 R에서 골프 팁을 읽어보십시오 !
Giuseppe



2

자바 스크립트 (ES7), 22 바이트

x=>(s=x**.5|0)/2+x/s/2

실제로 중간 변수가 필요하지 않으므로 실제로 다음과 같이 다시 작성할 수 있습니다.

x=>x/(x=x**.5|0)/2+x/2

테스트 사례


2

C, 34 바이트

@Olivier Grégoire에게 감사합니다!

s;
#define f(x)(x/(s=sqrt(x))+s)/2

float입력 에서만 작동합니다 .

온라인으로 사용해보십시오!

C,  41   39  37 바이트

s;
#define f(x).5/(s=sqrt(x))*(x+s*s)

온라인으로 사용해보십시오!

C,  49   47   45  43 바이트

s;float f(x){return.5/(s=sqrt(x))*(x+s*s);}

온라인으로 사용해보십시오!


2 바이트를 절약 한 @JungHwan Min에게 감사합니다!


1
47 바이트 ; 편집 : 감사합니다.하지만 @JungHwanMin을 찾아 주셔서 감사합니다.
Stan Strum



2

AWK , 47 44 38 바이트

{s=int($1^.5);printf"%.2f",$1/2/s+s/2}

온라인으로 사용해보십시오!

참고 : TIO like에는 \n출력을 더 예쁘게하기 위해 2 바이트가 더 있습니다. :)

sqrt를 사용하여 제곱근을 찾기 위해 약간의 바람을 피우는 것처럼 느껴지므로 여기에 몇 바이트가 더없는 버전이 있습니다.

{for(;++s*s<=$1;);s--;printf("%.3f\n",s+($1-s*s)/(2*s))}

온라인으로 사용해보십시오!


1
글쎄, 이것이 AWKward라고 말할 수 있습니다. 내가 보여 줄게 편집 : 원래 sqrt를 사용하여 질문을 피하려고 계획했지만 답변이 너무 많아서 원래 아이디어가 작동하도록 변경하면 불법 행위가 발생합니다.
Stan Strum

'AWK'말장난 재미 :)
Robert Benson

대신 sqrt($1)사용할 수 있습니다$1^.5
Cabbie407

고마워 @ Cabbie407 내가 왜 그런 생각하지 않았다.
Robert Benson

1
천만에요. 일부 다른 것들 : 당신이 필요하지 않은 \n출력을 얻기 위하여는, AWK에서의 printf 괄호를 필요로하지 않고 공식을 단축 할 수 s/2+$1/s/2있는 어떤 결과 {s=int($1^.5);printf"%.2f",s/2+$1/s/2}. 이 의견이 무례한 것 같으면 죄송합니다.
Cabbie407


1

PowerShell , 54 바이트

param($x)($x+($s=(1..$x|?{$_*$_-le$x})[-1])*$s)/(2*$s)

온라인으로 사용해보십시오! 또는 일부 테스트 사례를 확인

입력 $x을받은 다음 요청 된대로 정확하게 수행합니다. 이 |?부분은 제곱했을 때 입력 값 -l보다 크거나 같은 최대 정수를 찾은 다음 필요한 계산을 수행합니다. 출력은 암시 적입니다.e$x


와. 나는 사람들이 Windows Powershell에서 어떻게 골프를하는지 이해할 수 없었습니다
Stan Strum

@StanStrum 당신은 혼자가 아닙니다, lol. : D
AdmBorkBork

1

껍질 , 9 바이트

½Ṡ§+K/(⌊√

온라인으로 사용해보십시오!

이 답변에는 여전히 추한 것이 있지만 더 짧은 해결책을 찾지 못하는 것 같습니다.

설명

나는 Newton 알고리즘의 한 단계를 구현하고 있습니다 (실제로이 질문에서 제안 된 것과 동일합니다)

½Ṡ§+K/(⌊√
  §+K/       A function which takes two numbers s and x, and returns s+x/s
 Ṡ           Call this function with the input as second argument and
      (⌊√    the floor of the square-root of the input as first argument
½            Halve the final result

나는 당신이보다는, 실제 분할을 할 생각÷
H.PWiz

@ H.PWiz 으악, 감사합니다. 그것은 다른 해결책을 찾기위한 실험에서 남은 것입니다
Leo

1

Pyt , 11 10 바이트

←Đ√⌊Đ↔⇹/+₂

설명

code                explanation                        stack
←                   get input                          [input]
 Đ                  duplicate ToS                      [input,input]
  √⌊                calculate s                        [input,s]
    Đ               duplicate ToS                      [input,s,s]
     ↔              reverse stack                      [s,s,input]
      ⇹             swap ToS and SoS                   [s,input,s]
       /            divide                             [s,input/s]
        +           add                                [s+input/s]
         ₂          halve                              [(s+input/s)/2]
                    implicit print

방금 이것을 보았고 그것이 Pyth가 아니라는 것을 깨달을 때까지 좋은 순간이었습니다. 좋은 대답입니다.
Stan Strum

예, 그것은 한동안 생각 해왔고 실제로 만들기로 결정한 약간의 언어입니다.
mudkip201

ToS가 최상위 스택입니까? 그렇다면 그렇다면 SoS 란 무엇입니까?
Stan Strum

서비스 약관은 스택 맨, 그리고 조난 신호는 스택에 두 번째
mudkip201

좋아, 내가이 언어를 탐구 할 수 있는지 보자. 나는 그것을 좋아한다!
Stan Strum

1

은하수 , 17 14 바이트

Olivier Grégoire의 공식을 사용하여 -3 바이트

^^':2;g:>/+2/!

온라인으로 사용해보십시오!

설명

code              explanation                   stack layout

^^                clear preinitialized stack    []
  ':              push input and duplicate it   [input, input]
    2;            push 2 and swap ToS and SoS   [input, 2, input]
      g           nth root                      [input, s=floor(sqrt(input))]
       :          duplicate ToS                 [input, s, s]
        >         rotate stack right            [s, input, s]
         /        divide                        [s, input/s]
          +       add                           [s+input/s]
           2/     divide by 2                   [(s+input/s)/2]
             !    output                        => (s+input/s)/2

그게 천장이 아니라 바닥이 아닌가?
mudkip201

@ mudkip201 업데이트, 감사합니다
ovs

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