e의 근사


21

우리 는 Maclaurin 시리즈 확장 을 사용하여 일부 변수 x의 거듭 제곱으로 e로 표시된 오일러 수를 근사 할 수 있음을 알고 있습니다 .

e ^ x의 Maclaurin 시리즈 확장

x를 1로함으로써 우리는

e의 Maclaurin 시리즈 확장

도전

입력 N을 받아 오일러 수에 가까운 모든 언어로 프로그램을 작성하고 N 번째 항에 대한 계열을 계산합니다. 첫 번째 항에는 분모가 0!이 아니라 1!이 있습니다. 즉 N = 1은 1/0!에 해당합니다.

채점

바이트 수가 가장 적은 프로그램이 승리합니다.


7
N유한 정밀도 부동 소수점 수를 사용하는 경우 충분히 큰 결과가 동일합니다. 그 동작이 용납 될 수 N있습니까, 아니면 무한대에 가까워 질수록 결과가 점점 더 정확 해져야합니까?
FryAmTheEggman 2016 년

12
일부 테스트 사례는 깔끔합니다.
Lynn

7
(이러한 종류의 문제는 샌드 박스 에서 해결하는 것이 좋습니다. 도전을 먼저 게시하면 골퍼가 유용한 피드백을 제공합니다.)
Lynn

2
x ^ n은 n 번째 항입니까 (n + 1)입니까?
msh210

4
나는 개인적으로 그것을 경멸하지만 인덱스 0의 용어를 0 번째 용어로 언급하는 사람들이 있습니다. 그 문제에 대한 우리의 생각과는 별도로, 문제는 가능한 명확해야합니다. 또한 솔루션이 올바르게 작동하는지 확인하기위한 몇 가지 테스트 사례가 매우 유용합니다.
Dennis

답변:



13

Wistful-C -336 바이트

나의 첫번째 진짜 곰팡이가 많은 프로그램! 실제로는 약간의 골프 somedaywait for있는데, 첫 번째는 길이가 짧았 기 때문에 대신에 사용 했습니다 .

if only <stdio.h> were included...
if only int f were 1...
if only int N were 0...
wish for "%d",&N upon a star
if only int i were 0...
if only double e were 0...
someday i will be N...
        if only e were e+1./f...
        if only i were i+1...
        if only f were f*i...
*sigh*
wish "%f\n",e upon a star
if wishes were horses...

포함 할 필요가 없다고 들었습니다<stdio.h>
Leaky Nun

someday i were N...대신 작동 합니까 someday i will be N...?
Leaky Nun


9

TI-84 기본, 12 15 14

Input N
Σ(A!⁻¹,A,0,N

TI는 토큰 화 된 언어입니다 ( 바이트는 개별 문자가 아닌 토큰을 통해 계산 됨 ).


1
인용 된 메타 게시물에는 11 개의 upvotes와 10 개의 downvotes가 있습니다. 그것은 합의가 아닙니다. Ans유효한 입력 형식이 아니므로 15 바이트 버전 만 유효합니다.
Mego

그럴 수 있지; 편집 ...
이름 없음

1
AnsPPCG에서 항상 기본 입력 형식으로 사용되어 왔으며 (이전 TI 답변을 살펴보십시오) 동의하지 않는 것보다 더 많은 사람들이 동의하므로 답변을 변경하는 데 괴롭히지 마십시오.
Timtech

2
@MickLH 그것은 논쟁이 아닙니다. 게다가 이들은 8 비트 바이트입니다.
홉스

1
@Timtech 제가 동의하는 동안, 커뮤니티 합의는 Mego가 말한대로 정의됩니다.
코너 오브라이언

9

줄리아, 28 27 21 바이트

n->sum(1./gamma(1:n))

이것은 정수를 받아들이고 float를 반환하는 익명 함수입니다. 호출하려면 변수에 지정하십시오.

접근 방식은 매우 간단합니다. 우리 sum는 1에서 n 까지 평가 된 감마 함수로 1을 나눈 값 입니다. 이것은 n 속성을 이용합니다 ! = Γ ( n +1).

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

Dennis 덕분에 1 바이트를 절약하고 Glen O 덕분에 6 바이트를 절약했습니다!


MATLAB에서도 거의 동일 :@(n)sum(1./factorial(0:n))
flawr

6

파이썬, 36 바이트

파이썬 2 :

f=lambda n,i=1:n/i and 1.+f(n,i+1)/i

파이썬 3 :

f=lambda n,i=1:i<=n and 1+f(n,i+1)/i

파이썬 3 변형 된 길이 될 수 or대신 and: f=lambda n,i=1:i>=n or 1+f(n,i+1)/i.
생성자

6

dc, 43 바이트

[d1-d1<f*]sf[dlfx1r/r1-d1<e+]se1?dk1-d1<e+p

이것은 시리즈의 상당히 직접적인 번역입니다. 나는 영리하려고 노력했지만 코드가 길어졌습니다.

설명

[d1-d1<f*]sf

n> 0에 대한 간단한 계승 함수

[dlfx1r/r1-d1<e+]se

n, ..., 1에 대한 계승을 실행합니다. 반전 및 합계

1?dk1-

1로 스택을 프라이밍하십시오. 입력을 받아들이고 적절한 정밀도를 설정하십시오

d1<e+

입력이 0 또는 1이면 전달할 수 있습니다. 그렇지 않으면 부분 합을 계산하십시오.

p

결과를 인쇄하십시오.

시험 결과

처음 100 개의 확장 :

0
1
2
2.500
2.6666
2.70832
2.716665
2.7180553
2.71825394
2.718278766
2.7182815251
2.71828180110
2.718281826194
2.7182818282857
2.71828182844671
2.718281828458223
2.7182818284589936
2.71828182845904216
2.718281828459045062
2.7182818284590452257
2.71828182845904523484
2.718281828459045235331
2.7182818284590452353584
2.71828182845904523536012
2.718281828459045235360273
2.7182818284590452353602862
2.71828182845904523536028736
2.718281828459045235360287457
2.7182818284590452353602874700
2.71828182845904523536028747123
2.718281828459045235360287471339
2.7182818284590452353602874713514
2.71828182845904523536028747135253
2.718281828459045235360287471352649
2.7182818284590452353602874713526606
2.71828182845904523536028747135266232
2.718281828459045235360287471352662481
2.7182818284590452353602874713526624964
2.71828182845904523536028747135266249759
2.718281828459045235360287471352662497738
2.7182818284590452353602874713526624977552
2.71828182845904523536028747135266249775705
2.718281828459045235360287471352662497757231
2.7182818284590452353602874713526624977572453
2.71828182845904523536028747135266249775724691
2.718281828459045235360287471352662497757247074
2.7182818284590452353602874713526624977572470919
2.71828182845904523536028747135266249775724709352
2.718281828459045235360287471352662497757247093683
2.7182818284590452353602874713526624977572470936984
2.71828182845904523536028747135266249775724709369978
2.718281828459045235360287471352662497757247093699940
2.7182818284590452353602874713526624977572470936999574
2.71828182845904523536028747135266249775724709369995936
2.718281828459045235360287471352662497757247093699959554
2.7182818284590452353602874713526624977572470936999595729
2.71828182845904523536028747135266249775724709369995957475
2.718281828459045235360287471352662497757247093699959574944
2.7182818284590452353602874713526624977572470936999595749646
2.71828182845904523536028747135266249775724709369995957496673
2.718281828459045235360287471352662497757247093699959574966943
2.7182818284590452353602874713526624977572470936999595749669652
2.71828182845904523536028747135266249775724709369995957496696740
2.718281828459045235360287471352662497757247093699959574966967601
2.7182818284590452353602874713526624977572470936999595749669676254
2.71828182845904523536028747135266249775724709369995957496696762747
2.718281828459045235360287471352662497757247093699959574966967627699
2.7182818284590452353602874713526624977572470936999595749669676277220
2.71828182845904523536028747135266249775724709369995957496696762772386
2.718281828459045235360287471352662497757247093699959574966967627724050
2.7182818284590452353602874713526624977572470936999595749669676277240739
2.71828182845904523536028747135266249775724709369995957496696762772407632
2.718281828459045235360287471352662497757247093699959574966967627724076601
2.7182818284590452353602874713526624977572470936999595749669676277240766277
2.71828182845904523536028747135266249775724709369995957496696762772407663006
2.718281828459045235360287471352662497757247093699959574966967627724076630325
2.7182818284590452353602874713526624977572470936999595749669676277240766303508
2.71828182845904523536028747135266249775724709369995957496696762772407663035328
2.718281828459045235360287471352662497757247093699959574966967627724076630353518
2.7182818284590452353602874713526624977572470936999595749669676277240766303535449
2.71828182845904523536028747135266249775724709369995957496696762772407663035354729
2.718281828459045235360287471352662497757247093699959574966967627724076630353547565
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475915
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759429
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594542
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945681
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457111
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571352
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713792
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138185
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382143
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821752
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217826
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178492
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785218
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852481
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525131
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251635
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516607
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166394

1000 개의 용어 사용 :

2.7182818284590452353602874713526624977572470936999595749669676277240\
766303535475945713821785251664274274663919320030599218174135966290435\
729003342952605956307381323286279434907632338298807531952510190115738\
341879307021540891499348841675092447614606680822648001684774118537423\
454424371075390777449920695517027618386062613313845830007520449338265\
602976067371132007093287091274437470472306969772093101416928368190255\
151086574637721112523897844250569536967707854499699679468644549059879\
316368892300987931277361782154249992295763514822082698951936680331825\
288693984964651058209392398294887933203625094431173012381970684161403\
970198376793206832823764648042953118023287825098194558153017567173613\
320698112509961818815930416903515988885193458072738667385894228792284\
998920868058257492796104841984443634632449684875602336248270419786232\
090021609902353043699418491463140934317381436405462531520961836908887\
070167683964243781405927145635490613031072085103837505101157477041718\
986106873969655212671546889570350116

5

J, 10 바이트

[:+/%@!@i.

직접적인 접근.

설명

[:+/%@!@i.    Input: n
        i.    Creates the range [0, 1, ..., n-1]
      !@      Maps factorial to each
    %@        Map 1/x to each
[:+/          Take the sum of the values and return it

좋은. 사소한 1 바이트 개선 :1#.%@!@i.
Jonah

4

CJam, 11

r~,:m!Wf#:+

또는

r~{m!W#}%:+

온라인 시도 : 첫 번째 버전두 번째 버전

설명:

r~= 읽기 및 평가
m!= 계승
W#= -1 제곱으로 올림 ( W= -1)
:+= 배열의 합
첫 번째 버전은 [0… N-1] 배열을 구성하고 모든 요소에 계승과 역을 적용합니다. 두 번째 버전은 각 숫자에 대해 계승 및 역수를 수행하고 배열에 넣습니다.


4

자바 스크립트 ES6, 44 42 40

n=>{for(k=s=m=1;m<n;s+=k/=m++);return s}

명명되지 않은 함수입니다.

2Alex @AlexA를 저장해 주셔서 감사하며 @LeakyNun에게 2 바이트를 추가해 주셔서 감사합니다!


n=>{for(k=s=m=1;m<n;s+=k/=m++);return s}
Leaky Nun

4

MATL, 11 7 바이트

:Ygl_^s

@Luis의 권장 사용으로 인해 4 바이트가 절약되었습니다 gamma( Yg)

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

설명

        % Implicitly grab input (N)
:       % Create an array from 1...N
Yg      % Compute factorial(x-1) for each element (x) in the array
l_^     % Take the inverse
s       % Sum all elements
        % Implicitly display the result

당신은 제거 할 수 있습니다]
루이스 Mendo에게

또한 1i:Yg/s7 바이트
Luis Mendo

@LuisMendo 아 맞아요. 계승을 얻는 더 좋은 방법이 있기를 바랐지만 감마에 대해 잊어 버렸습니다. 곧 업데이트
예정

4

MATL , 6 바이트

q_t1Zh

이것은 초기 하 함수 1 F 1 ( a ; b ; z )을 사용하여 합계를 계산합니다 .

여기에 이미지 설명을 입력하십시오

Hypergeometric 함수가 정의되는 방식의 차이 로 인해 Octave 및 온라인 컴파일러에서는 작동하지만 Matlab에서는 작동하지 않습니다 .

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

설명

q_    % Take N implicitly. Compute -N+1
t     % Duplicate
1     % Push 1
Zh    % Hypergeometric function 1F1(-N+1;-N+1;1). Implicitly display

4

C, 249 바이트

#include <stdio.h>
#include <stdlib.h>
#define z double
z f(z x){z r=1;z n=1;while(x>0){r*=n;n++;x--;}return r;}int main(int argc, char **argv){z e=0;z p=0;z d=0;p=strtod(argv[1],NULL);while(p>0){e+=1.0d/f(d);printf("%.10f\n",e);p--;d++;}return 0;}

언 골프 드 :

/* approximate e */

#include <stdio.h>
#include <stdlib.h>

double fact(double x){
    double result = 1;
    double num = 1;

    while (x > 0){
        result *= num;
        num++;
        x--;
    }
    return result;
}

int main(int argc, char **argv){
    double e = 0;
    double precision = 0;
    double denom = 0;

    precision = strtod(argv[1], NULL);
    while (precision > 0){
        e += 1.0d / fact(denom);
        printf("%.10f\n", e);
        precision--;
        denom++;
    }
    return 0;
}

반복 횟수를 결정하기 위해 숫자를 인수로 사용합니다.


안녕하세요, PPCG에 오신 것을 환영합니다! 위대한 첫 번째 게시물!
NoOneIsHere6

프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 이 프로그램은 마지막 근사값 만 인쇄하는 것으로 생각됩니다. GCC와 적어도, 당신은 필요하지 않습니다 int전에 main하고 return 0. 바꿀 경우에도, NULL함께 0, 당신은 포함하지 않아도됩니다. argcargv단일 문자 변수로 단축 할 수있다. C 골프를 즐기는 경우 C 골프 팁이 도움 이 될 수 있습니다.
Dennis

IMHO는 컴파일러가 경고를 발생 시키지만 올바른 결과를 반환하더라도 오류없이 아무것도 줄일 수없는 수준까지 코드의 많은 부분을 버릴 수 있습니다.
Andreï Kostyrka

그리고 당신은 필요하지 않습니다#include <stdio.h>
Leaky Nun

3

k (13 바이트)

오버 플로우 될 수 있음 N>20

{+/%*\1,1+!x}


3

파이크, 10 바이트

FSBQi^R/)s

여기 사용해보십시오!

또는 power = 1 인 경우 8 바이트

FSB1R/)s

여기 사용해보십시오!


첫 번째 코드는 내가 그것을 실행할 때 3 이상으로 벗어났습니다. 5.436532738095238
tox123

@ tox123 수정 됨
Blue

이것을 테스트하고 있습니까? 나는 얻었다 : 7.3887125220458545 첫 번째, 두 번째는 훨씬 잘 작동합니다.
tox123

저것은 당신이 e가 아닌 e ^ x입니다
Blue

그것은 도전이 아닙니다.
tox123

3

자바 스크립트 (ES6), 28 바이트

f=(n,i=1)=>n&&1+f(n-1,i+1)/i

3

Dyalog APL , 6 바이트

+/÷!⍳⎕

+/ 의 합
÷0에서 숫자 입력 까지
!의 계승의 역수의

⎕IO←0많은 시스템에서 기본값으로 가정 합니다.

TryAPL !


3

하스켈, 37 바이트

((scanl(+)0$(1/)<$>scanl(*)1[1..])!!)

가장 짧지는 않지만 가장 아름답습니다.


Laikoni의 호의로 2 바이트 더 짧은 솔루션이 있습니다 .

sum.(`take`((1/)<$>scanl(*)1[1..]))

λ> let f = ((scanl (+) 0 $ (1/) <$> scanl (*) 1 [1..]) !!)

λ> map f [1..5]
[1.0,2.0,2.5,2.6666666666666665,2.708333333333333]

λ> f 10
2.7182815255731922

λ> f 100
2.7182818284590455

λ> log (f 10)
0.9999998885745155

λ> log (f 100)
1.0

2
이 UTF-8 바이트 카운터를 사용할 수 있습니다 . 바이트 수를 추가하기 위해 제안 된 편집을했습니다 50. 헤더를 추가하려면 다음을 사용하십시오 ## Language, <xxx> bytes..
NoOneIsHere6

1
공백이 필요합니까?
NoOneIsHere6

1
입력이 변수에 있다고 가정 할 수 없으므로 유효한 함수 제출 을 앞에 추가 f n=하거나 가져와야 \n->합니다. 그러나, 우리는 또한 몇 바이트를 저장할 수 있습니다 (\x->1/x)섹션을 단축 할 수 (1/), [1,2..]과 동일 [1..]하고 map(...)$할 수있다 (...)<$>. Together 36 bytes : 온라인으로 사용해보십시오!
Laikoni

1
포인트 프리 기능으로 변환하면 다른 바이트가 절약 됩니다. 온라인으로 사용해보십시오! 그리고 바이트가 ((scanl(+)0$(1/)<$>scanl(*)1[1..])!!)길더라도 멋지게 보입니다.
Laikoni

1
괄호가없는 버전은 그 뒤에 값을 삽입 할 때 유효한 Haskell 표현식 일 뿐이지 만 미리 정의 된 변수에 입력 할 수 없다고 가정 하면 괄호를 추가하거나 다시 \n->작성해야합니다 기능.
Laikoni

3

APL (Dyalog Unicode) , 5 바이트

⍳⊥⊢÷!

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

에서 발견 된 혼합 기본 트릭을 사용하여 내 대답또 다른 도전을 . 사용합니다 ⎕IO←0.

작동 원리

⍳⊥⊢÷!  Right argument: n, the number of terms
  ⊢÷!  v: 1÷(n-1)!
      B: The array of 0 .. n-1
      Expand v to length-n array V,
       then mixed base conversion of V in base B

Base | Digit | Value
--------------------
0    | v     | v×(1×2×..×(n-1)) = 1÷0!
1    | v     | v×(2×3×..×(n-1)) = 1÷1!
2    | v     | v×(3×..×(n-1))   = 1÷2!
..   | ..    | ..
n-2  | v     | v×(n-1)          = 1÷(n-2)!
n-1  | v     | v                = 1÷(n-1)!

10k 담당자! 내가 튜링 머신에서 이것을 뽑을 수 있는지 알아보기 위해 ..
ouflak

좋은 대답이지만 1÷(n-1)!숫자가 어떻습니까? 명확히하기 위해 J로 번역 할 수 있습니까?
요나


2

Brachylog , 18 바이트

:1-:0r:ef:$!a:/a+.

설명

:1-                 Subtract 1 from Input
   :0r              Create the list [0, Input - 1]
      :ef           Find all integers between 0 and Input - 1
         :$!a       Apply factorial to each member of that list
             :/a    Apply inverse to each element of that list
                +.  Unify the output with the sum of the list

2

메이플, 18

add(1/i!,i=0..n-1)

용법:

> f:=n->add(1/i!,i=0..n-1);
> f(1);
  1
> f(4);
  8/3

나는 함수가 n-> add (1 / i
!,


2

10 피트 레이저 극을 가진 자바 , 238 236 바이트

import sj224.tflp.math.*;interface U{static void main(String[]a){BigRational r=null,s,t;r=s=t=r.ONE;for(int n=new java.util.Scanner(System.in).nextInt()-1;n-->0;){t=t.multiply(r);s=s.add(t.pow(-1));r=r.add(r.ONE);}System.out.print(s);}}

대부분의 다른 답변보다 오버플로 저항이 훨씬 뛰어납니다. 100 개의 항에 대해 결과는

31710869445015912176908843526535027555643447320787267779096898248431156738548305814867560678144006224158425966541000436701189187481211772088720561290395499/11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364608000000000000000000000

2

줄리아, 28 바이트

~k=k<1?1:1/gamma(k+1)+~(k-1)

설명

~k=                    #Define ~ to be
    k<1                #If k is less than 1
        ?1             #to be one
        :1/gamma(k+1)  #else add the reciprocal factorial to 
            +~(k-1)    #the function applied to the predecessor value

gamma(k+1)factorial(k)양의 정수 입력의 경우와 같고 음이 아닌 정수 이외의 모든 값에 대해 일반화합니다. 1 바이트를 절약하므로 왜 사용하지 않습니까?


1

MATLAB / 옥타브, 22 바이트

@(x)sum(1./gamma(1:x))

다음을 ans사용하여 호출 할 수 있는 익명 함수 를 작성합니다.ans(N) .

이 솔루션은와 gamma(x)같은 배열 [1 ... N]의 각 요소에 대해 계산 합니다 factorial(x-1). 그런 다음 각 요소의 역을 취하고 모든 요소를 ​​합산합니다.

온라인 데모


1

펄 5, 37 바이트

승자는 아니지만 훌륭하고 간단합니다.

$e=$p=1;$e+=1/($p*=$_)for 1..<>;say$e

0에서 10까지의 입력에 대한 출력 :

1
2
2.5
2.66666666666667
2.70833333333333
2.71666666666667
2.71805555555556
2.71825396825397
2.71827876984127
2.71828152557319
2.71828180114638


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