대략적인 내 사각형


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.