Dottie 수의 근사치


17

도티 번호 코사인 함수의 정점 또는 방정식의 해결책 COS (X) = X . 1

당신의 임무는이 상수에 가까운 코드를 만드는 것입니다. 코드는 정수를 입력으로 받아서 실수를 출력하는 함수를 나타내야합니다. 입력이 증가함에 따라 함수의 한계는 Dottie 수 여야합니다.

숫자의 분수, 소수 또는 대수 표현으로 출력 할 수 있습니다. 출력은 임의로 정교 할 수 있어야하며, 플로트 및 더블은이 문제에 충분하지 않습니다. 언어가 임의의 정밀도 숫자를 사용할 수없는 경우 언어를 구현하거나 새 언어를 선택해야합니다.

이것은 질문이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.

상수를 계산하는 한 가지 방법은 임의의 수를 취하고 코사인을 반복적으로 적용하는 것입니다. 응용의 수가 무한대에 가까워 질수록 결과는 고정 코사인 점으로 향합니다.

다음은 숫자의 정확한 근사값입니다.

0.739085133215161

1 : 여기서 우리는 라디안으로 코사인을 취할 것입니다


따라서 Python을 사용하는 경우 자체 유형 또는 가져 오기를 구현해야합니다 Decimal.
Mr. Xcoder

제출물이 얼마나 정확해야합니까?
Mr. Xcoder

훔치기 위해 젤리 튜토리얼로 이동하여 ÆẠȷ¡그것이 유효하지 않다는 것을 깨닫습니다. Brachylog 시도; 오 Brachylog는 심지어 수레도하지 않습니다.
아웃 골퍼 Erik 14

1
"임의로 정확한"요구 사항이 너무 엄격하다고 생각합니다. 왜 대답이 한 번만 유효한 것으로 간주하지 x=cos(x)않습니까?
kamoroso94 오전 4'17

2
Haskell, APL 및 일부 Lisp 맛에서 이것을보고 싶습니다.
Mark C

답변:


7

MATL , 34 30 19 바이트

Sanchises 덕분에 11 바이트 할인 !

48i:"'cos('wh41hGY$

출력의 마지막 10 진수는 꺼져있을 수 있습니다. 그러나 왼쪽부터 시작하여 올바른 숫자의 수가 입력에 따라 증가하고 결과는 실제 상수로 수렴됩니다.

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

설명

입력 n의 경우 x = 1 에서 시작 하면 함수가 적용됩니다.

              x ↦ cos ( x )

함께 N -digit 가변 정밀도 산술 N 개의 시간.

48         % Push 48, which is ASCII for '1': initial value for x as a string
i:"        % Do n times, where n is the input
  'cos('   %   Push this string
  w        %   Swap. Moves current string x onto the top of the stack
  h        %   Concatenate
  41       %   Push 41, which is ASCII for ')'
  h        %   Concatenate. This gives the string 'cos(x)', where x is the
           %   current number
  GY$      %   Evaluate with variable-prevision arithmetic using n digits
           %   The result is a string, which represents the new x
           % End (implicit). Display (implicit). The stack contains the last x

왜 n 자리 정밀도로 n 번 적용하지 않습니까? 지나치게 복잡해 보입니다.
Sanchises

1
이것은 믿기 힘든 일이야. APL에서보고 싶습니다.
Mark C


4

GNU bc -l, 30

-l플래그를 표시 할 때 점수에 +1이 포함 됩니다 bc.

for(a=1;a/A-b/A;b=c(a))a=b
a

마지막 줄 바꿈은 중요하고 필요합니다.

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

-l 두 가지 일을합니다 :

  • c()cos (x)를 포함하여 "math"라이브러리 활성화
  • 정밀도 (스케일)를 소수점 이하 20 자리로 설정 ( bc임의의 정밀도 계산)

정밀도 요구 사항에 대해서는 명확하지 않습니다. 그대로,이 프로그램은 소수점 이하 20 자리까지 계산합니다. 다른 정밀도가 필요한 scale=n;경우 프로그램 시작시 n소수점 이하 자릿수를 삽입해야 합니다. 이 점수를 내 점수에 추가해야하는지 모르겠습니다.

소수점 이하 자릿수 (예 : 21, 20은 아님)의 경우 계산은 마지막 자리에서 솔루션의 양쪽을 진동시킵니다. 따라서 현재 반복과 이전 반복을 비교할 A때 마지막 자리를 지우려면 양쪽을 10 ( )으로 나눕니다 .


4

매스 매 티카, 22 바이트

Nest[Cos@#&,0,9#]~N~#&

입력

[100]

산출

0.73908513321516064165531208767387340401341175890075746496568063577328 \ 46548835475945993761069317665318



3

K : 6 바이트

  _cos/1
0.7390851

f/f고정 점에 도달 할 때까지 적용됩니다 .


k의 어떤 버전입니까? _내가 아는 대부분의 버전에서 바닥입니다. K4하고 확인을 당신은 5 바이트 얻을 수 있습니다cos/1
낙서

K3. 내장은 밑줄로 시작합니다.
tangentstorm

1
흥미로운! 나는 야생에서 k3를 보지 못했습니다. :)이 포럼에 사용되는 몇 가지 버전보다 더 있기 때문에 가치 등을 라벨 수 있습니다
낙서

2

R (+ Rmpfr), 55 바이트

function(n,b=Rmpfr::mpfr(1,n)){for(i in 1:n)b=cos(b);b}

Dennis는 이제 Rmpfr을 TIO에 추가하여 작동합니다. 몇 가지 테스트 사례를 추가했습니다.

설명:

나는에서 쓴 코드 소요 이러한 과제 평가 cos n에서 시작 시간을 1, 그러나 첫째로 나는 값이 객체 생성에 의해되고 싶어 정밀도 지정 b클래스를 mpfr1과 정밀도를 n, n>=2우리가 앞으로 더 정밀도를 얻을 수 있도록.

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


3
다시 시도하십시오. :) 앞으로 TIO에 빠진 것이 있으면 talk.tryitonline.net에 메시지를 남겨주십시오 .
Dennis

@Dennis 감사합니다! 앞으로도 염두에 두겠습니다!
Giuseppe


2

dzaima / APL , 55 바이트

⎕←⊃{⍵,⍨-/P,((P÷⍨×)/¨(2×⍳N)⍴¨⊃⍵)÷!2L×⍳N}⍣{⍵≢∪⍵}P10L*N←⎕

10N1NN

TIO의 dzaima / APL이 bigintegers를 지원하도록 업데이트되지 않았으므로 TIO 링크가 없습니다.

예제 I / O :

1
9L

10
7390851332L

100
7390851332151606416553120876738734040134117589007574649656806357732846548835475945993761069317665318L

200
73908513321516064165531208767387340401341175890075746496568063577328465488354759459937610693176653184980124664398716302771490369130842031578044057462077868852490389153928943884509523480133563127677224L


1

Pyth , 57 54 바이트

u_.tG1lX$globals()$"neg"$__import__("decimal").Decimal

우리가 Decimal을 사양에 맞출 필요가 없다면 훨씬 짧을 것입니다.

어쨌든 숫자가 필요하기 때문에 1 : 3 바이트를 편집하십시오. 따라서 X반환 된 globals()길이의 사본을 시작 값으로 사용하여 끝으로 이동하고 $공백을 제거 할 수 있습니다.

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


1

APL (Dyalog Unicode) , 9 바이트

2○⍣=1

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

( 참고 : 티오가 추가로 있습니다 ⎕←..;이이 위에 표시된 정확한 표현을 사용 TIO A "독립"APL 통역에 필요한 주어진 바이트 수는하지와 하나 위의 표현을위한 어떤 TIO의 계산이다 ⎕←. )

분해 / 설명 :

2○⍣=1
            Apply repeatedly the function...
2           ...cosine of x (in radians), such that...
    1        ...the initial value of x is 1, and...
   =         ...if cos x is NOT equal to x, then re-evaluate, substituting cos x for x...
             ...until they ARE equal.

함수 cos x (2 ○ x)를 처음 평가할 때 x = 1이면 같지 않습니다. cos 1은 0.5403 ...이므로 1을 0.5403으로 바꾸고 다시 평가하고 x = 0.73908에 대해 발생하는 (2 ○ x) = x가 될 때까지 프로세스를 반복하십시오.

이것을 만들 때 나는 "인쇄 정밀도"에 대한 기본값을 사용했는데, 이는 PLPP ←를 사용하여 APL에서 설정할 수 있습니다. Dyalog APL이 허용하는 ⎕PP의 최대 값은 34 자리입니다.

또한이 구현의 기본 정밀도는 64 비트 부동 소수점입니다. ⎕FR ← 1287을 설정하여 128 비트 플로트를 사용할 수 있습니다. TIO 계산은 64 비트 부동 소수점으로 수행됩니다.

컴퓨터 언어의 실제 구현은 진정으로 임의의 정밀도를 제공 할 수 없습니다. 그러나, 이론적 인 APL에 대한 코드 않은 임의의 정밀도를 구현이 될 정확히 같은 .


5 바이트입니다.
Adám

채팅에서 언급했듯이 NARS2000 솔루션이어야하며 Dyalog에서는 유효하지 않습니다. 그런 다음 올바른 항목을 만들려면을 설정 ⎕CT←0하고에 입력을 할당 해야 합니다 ⎕FPC.
dzaima

이것은 사양에 필요한 임의의 정밀도를 지원하지 않습니다.Your output should be capable of being arbitrarily precise, floats and doubles are not sufficient for this challenge.
Grimmy


0

펄 5, 41 바이트

use bignum;sub f{$_[0]?cos(f($_[0]-1)):0}

임의의 정밀도를 위해서는 Bignum이 필요합니다. 코사인을 0 N 회에 재귀 적으로 적용하는 함수 f를 정의합니다.

TIO는 큰 숫자를 가지고 있지 않으므로 링크가 없습니다 :(


0

매스 매 티카 44 바이트

FindRoot[Cos@x-x,{x,0},WorkingPrecision->#]&

FindRoot 기본적으로 Newton의 방법을 사용합니다.


0

파이썬 2, 86 바이트

import math as m,decimal as d
def f(x,n):return f(d.Decimal(m.cos(x)),n-1)if n else x

제공된 팁을 사용하는 새 버전.

파이썬 2, 105 바이트

import math as m,decimal as d
def f(x,n):return d.Decimal(f(x+(m.cos(x)-x)/(m.sin(x)+1),n-1))if n else x

사용 뉴턴의 방법 값을 계산하고 재귀 함수를. x초기 값이며 n재귀 한계입니다.


파이썬의 내장 float 유형은 정밀도가 무한하므로 함수는 실제로 점근 적이 지 않습니다.
애드혹 가프 헌터

고마워요 더 이상 너무 짧지 않은 것 같아요 :)
SydB

질문에 제공된 팁은 아마도 Newton의 방법보다 짧을 것입니다.
애드혹 가프 헌터

다시 한 번 감사 드리며, 멋진 수학에 너무 빠져 들었던 것 같습니다.
SydB

함수는 n요구 사항에 따라 1 개의 인수 만 취해야 하므로 기본값을 지정해야합니다 x=0. 또한이 기능은 math.cos고정밀 이므로 임의의 정확도 는 아닙니다 .
Surculose Sputum

0

공리, 174 바이트

f(n:PI):Complex Float==(n>10^4=>%i;m:=digits(n+10);e:=10^(-n-7);a:=0;repeat(b:=a+(cos(a)-a)/(sin(a)+1.);if a~=0 and a-b<e then break;a:=b);a:=floor(b*10^n)/10.^n;digits(m);a)

ungolfed 및 댓글

-- Input: n:PI numero di cifre
-- Output la soluzione x a cos(x)=x con n cifre significative dopo la virgola
-- Usa il metodo di Newton a_0:=a  a_(n+1)=a_n-f(a_n)/f'(a_n)
fo(n:PI):Complex Float==
  n>10^4=>%i
  m:=digits(n+10)
  e:=10^(-n-7)
  a:=0     -- Punto iniziale
  repeat
     b:=a+(cos(a)-a)/(sin(a)+1.)
     if a~=0 and a-b<e then break
     a:=b
  a:=floor(b*10^n)/10.^n
  digits(m)
  a

결과 :

(3) -> for i in 1..10 repeat output[i,f(i)]
   [1.0,0.7]
   [2.0,0.73]
   [3.0,0.739]
   [4.0,0.739]
   [5.0,0.73908]
   [6.0,0.739085]
   [7.0,0.7390851]
   [8.0,0.73908513]
   [9.0,0.739085133]
   [10.0,0.7390851332]
                                                               Type: Void
           Time: 0.12 (IN) + 0.10 (EV) + 0.12 (OT) + 0.02 (GC) = 0.35 sec
(4) -> f 300
   (4)
  0.7390851332 1516064165 5312087673 8734040134 1175890075 7464965680 635773284
  6 5488354759 4599376106 9317665318 4980124664 3987163027 7149036913 084203157
  8 0440574620 7786885249 0389153928 9438845095 2348013356 3127677223 158095635
  3 7765724512 0437341993 6433512538 4097800343 4064670047 9402143478 080271801
  8 8377113613 8204206631
                                                      Type: Complex Float
                                   Time: 0.03 (IN) + 0.07 (OT) = 0.10 sec

Newton 방법은 'repeated cos (x) 방법'보다 빠르기 때문에 사용합니다.

 800   92x
1000  153x
2000  379x

첫 번째 열에는 자릿수가 있고 두 번째 열에는 반복되는 cos (x) 방법을 사용하는 것보다 Newton 방법이 얼마나 빠릅니다. 좋은 아침


0

Stax , 5 바이트

╘ñ[EΩ

실행하고 디버그하십시오 .

1       Push 1 to the stack, this will be our initial variable
 {      Begin block
  |7    Cosine
    }N  Repeat block a number of times specified by the input

1
이것은 사양에 필요한 임의의 정밀도를 지원하지 않습니다.Your output should be capable of being arbitrarily precise, floats and doubles are not sufficient for this challenge.
Grimmy

0

자바 스크립트 (Node.js) , 84 바이트

n=>"0."+(F=(J,Z=c=0n)=>J?F(J*-I*I/++c/++c/B/B,Z+J):I-Z>>2n?(I=Z,F(B)):I)(B=I=10n**n)

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

대략 n-1자릿수 의 정밀도를 갖습니다 . BigInt가 사용되며 cos(x)Taylor 확장을 사용하여 계산됩니다. 이 I-Z>>2n부분은 루핑을 영원히 방지하기 위해 사용됩니다 (4 바이트의 비용과 약간의 정밀도). 이론적으로는 임의의 정밀도에 적용 할 수 있지만 실제 범위는 n<63스택 오버플 로 때문입니다.

더 짧은 (82 바이트), 스택 오버플로에 대한 걱정은 없지만 정밀도는 훨씬 떨어집니다

n=>"0."+eval("for(I=B=10n**n;n--;I=Z)for(Z=J=B,c=0n;J;)Z+=(J=J*-I*I/++c/++c/B/B)")

스택 오버플로 ( n<172) 까지 범위가 훨씬 짧지 만 (80 바이트) 82 바이트와 동일한 정밀도입니다.

n=>"0."+(F=(J,Z=c=0n)=>J?F(J*-I*I/++c/++c/B/B,Z+J):n--?(I=Z,F(B)):I)(B=I=10n**n)

임의의 정밀도가 요점이 아닌 경우 25 바이트 :

F=n=>n?Math.cos(F(n-1)):1

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