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클래스를 mpfr값 1과 정밀도를 n, n>=2우리가 앞으로 더 정밀도를 얻을 수 있도록.

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


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

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


2

dzaima / APL , 55 바이트

⎕←⊃{⍵,⍨-/P,((P÷⍨×)/¨(2×⍳N)⍴¨⊃⍵)÷!2L×⍳N}⍣{⍵≢∪⍵}P←10L*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.