E yaklaşımı


21

Hepimiz biliyoruz ki, euler'in , bazı x değişkeninin gücüne göre gösterdiği sayı , Maclaurin Serisi genişletmesi kullanılarak tahmin edilebilir :

Maclaurin series expansion of e^x

X eşittir 1

Maclaurin series expansion of e

Meydan okuma

Herhangi bir dilde, bir giriş N alarak Euler sayısını tahmin eden ve seriyi N. Terim olarak hesaplayan herhangi bir dilde yazın. İlk terimin payda 0! Olduğunu, 1! Değil, yani N = 1'in 1/0! 'E karşılık geldiğini unutmayın.

puanlama

En az bayt içeren program kazanır.


7
NEğer sonlu bir hassas kayar nokta sayısı kullanılırsa, sonuçlar yeterince büyük olduğu zaman aynı olacaktır. Bu davranış kabul edilebilir mi veya sonucun Nsonsuzluğa yaklaştıkça giderek daha doğru olması gerekiyor mu?
FryAmTheEggman

12
Bazı test senaryoları düzgün olurdu.
Lynn

7
(Bu tür bir sorun tercihen kum havuzunda çözülür - önce zorluklarınızı orada gönderirseniz, golfçüler yararlı geri bildirim verecektir.)
Lynn

2
X ^ n n'inci terim mi, yoksa (n + 1) mi?
msh210

4
Şahsen bunu hor görüyorum, ancak indeks 0'daki terimi sıfırıncı terim olarak ifade eden insanlar var. Bu konudaki düşüncelerimizden bağımsız olarak, soru olabildiğince açık olmalıdır. Ayrıca, çözümlerin doğru çalıştığını doğrulamak için birkaç test vakası çok yardımcı olacaktır.
Dennis

Yanıtlar:



13

Wistful-C - 336 bayt

İlk gerçek hüzünlü programım! Aslında biraz golf var, somedaybunun yerine kullanarak wait forilk kısa bir uzunluğu vardı.

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>
Dahil

someday i were N...Bunun yerine çalışıyor mu someday i will be N...?
Leaky Nun


9

TI-84 TEMEL, 12 15 14

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

TI tokenize edilmiş bir dildir ( baytlar ayrı ayrı karakterler değil tokenlerle sayılır ).


1
Atıfta bulunulan meta yayın 11 yukarı ve 10 aşağı oy içeriyor. Bu bir fikir birliği değil. Ansgeçerli bir giriş biçimi olmadığından, yalnızca 15 baytlık sürüm geçerlidir.
Mego

yeterince adil; düzenleme ...
No Name

1
Ansher zaman burada PPCG'deki varsayılan giriş biçimi olmuştur (eski TI cevaplarıma bakın) ve daha fazla kişi buna katılmamaya katılıyor, bu yüzden cevabınızı değiştirmeye zorbalık etmeyin.
Timtech

2
@MickLH buradaki anlaşmazlık değil. Ayrıca, bunlar 8 bit bayttır.
hobbs

1
@Timtech Sana katılıyorum, ancak topluluk mutabakatı Mego'nun dediği gibi tanımlanıyor.
Conor O'Brien

9

Julia, 28 27 21 bayt

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

Bu, bir tamsayıyı kabul eden ve bir kayan nokta döndüren anonim bir işlevdir. Bunu çağırmak için bir değişkene atayın.

Yaklaşım oldukça basittir. Biz sum1'in 1'den n'ye kadar her birinde değerlendirilen gama fonksiyonuna bölünmesi . Bu özellik n yararlanır ! = Γ ( n +1).

Çevrimiçi deneyin!

Dennis sayesinde 1 bayt ve Glen O sayesinde 6 bayt tasarruf etti!


MATLAB'da hemen hemen aynı:@(n)sum(1./factorial(0:n))
Kusur

6

Python, 36 bayt

Python 2:

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

Python 3:

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

Python 3 varyantı ile kısa olabilir oryerine and: f=lambda n,i=1:i>=n or 1+f(n,i+1)/i.
Oluşturucu

6

dc, 43 bayt

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

Bu, serinin oldukça doğrudan bir çevirisi. Zeki olmaya çalıştım, ama bu daha uzun kodla sonuçlandı.

açıklama

[d1-d1<f*]sf

N> 0 için basit bir faktöriyel fonksiyon

[dlfx1r/r1-d1<e+]se

N, ..., 1 için faktöriyeli yürütme; ters çevir ve topla

1?dk1-

Yığını 1 ile doldurun; girişi kabul edin ve uygun bir hassasiyet ayarlayın

d1<e+

Girdi 0 veya 1 ise, bunu aktarabiliriz, yoksa kısmi toplamı hesaplayabiliriz.

p

Sonucu yazdırın.

Test sonuçları

İlk 100 açılım:

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 terim kullanarak:

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

5

J, 10 bayt

[:+/%@!@i.

Basit yaklaşım.

açıklama

[:+/%@!@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

Güzel. Önemsiz 1 bayt iyileştirme:1#.%@!@i.
Jonah

4

CJam, 11

r~,:m!Wf#:+

veya

r~{m!W#}%:+

Çevrimiçi deneyin: ilk sürüm ve ikinci sürüm

Açıklama:

r~= okuma ve değerlendirme
m!= faktöryel
W#= -1 gücüne yükseltme ( W= -1)
:+= dizi toplamı
İlk sürüm [0… N-1] dizisini oluşturur ve tüm öğelerine faktöryel ve ters uygular; 2. sürüm faktöriyel ve her sayı için ters yapar sonra bir diziye koyar.


4

JavaScript ES6, 44 42 40

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

Şimdi adsız bir işlev.

@AlexA 2 bayt kaydettiğiniz için teşekkür ederiz ve başka 2 bayt için @LeakyNun teşekkürler!


n=>{for(k=s=m=1;m<n;s+=k/=m++);return s}
Sızdıran Rahibe

4

MATL, 11 7 bayt

:Ygl_^s

@ Luis'in kullanma önerisi sayesinde 4 byte tasarruf gamma( Yg)

Çevrimiçi Deneyin

açıklama

        % 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

Sen kaldırabilirsiniz]
Luis Mendo

Ayrıca, 1i:Yg/s7 bayt için
Luis Mendo

@LuisMendo oh evet bir faktöriyelere ulaşmak için daha iyi bir yol olduğunu umuyordum ama gammayı unutmuştum. Kısa süre içinde güncellenecek
Suever

4

MATL , 6 bayt

q_t1Zh

Bu, hipergeometrik işlevi kullanarak toplamı hesaplar 1 F 1 ( a ; b ; z ) :

enter image description here

Hipergeometrik fonksiyonun nasıl tanımlandığına (düzeltilecek) bir farklılık nedeniyle Octave ve çevrimiçi derleyici üzerinde çalışır, ancak Matlab üzerinde çalışmaz.

Çevrimiçi deneyin!

açıklama

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 bayt

#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;}

Ungolfed:

/* 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;
}

Yineleme sayısını belirlemek için bir sayıyı bağımsız değişken olarak alır.


Merhaba, PPCG'ye hoş geldiniz! Harika ilk gönderi!
NoOneIsHere

Programlama Bulmacaları ve Kod Golf hoş geldiniz! Programın sadece son yaklaşımı basması gerektiğini düşünüyorum. En azından GCC ile, daha intönce mainve return 0. Ayrıca, NULLile değiştirirseniz 0, içerme işlemine ihtiyacınız yoktur.argcve argvtek harfli değişkenlere kısaltılabilir. Eğer C golf oynamaktan hoşlanıyorsanız, C Golf için ipuçları yararlı bulabilirsiniz.
Dennis

IMHO, derleyici bazı uyarılar verse de yine de doğru sonucu döndürse bile, kodunuzun birçok parçasını hiçbir şeyin hatasız bir şekilde azaltılamayacağı noktaya atabilirsiniz.
Andreï Kostyrka

Ve ihtiyacınız yok#include <stdio.h>
Leaky Nun

3

k (13 bayt)

İçin taşmalara tabi N>20

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

3

05AB1E, 6 bayt

$L<!/O

Açıklaması

$           # push 1 and input: N = 5
 L<         # range [0..N-1]: [0,1,2,3,4]
   !        # factorial over range [1,1,2,6,24]
    /       # divide 1/range: [1.0, 1.0, 0.5, 0.16666666666666666, 0.041666666666666664]
     O      # sum: 2.708333333333333

Çevrimiçi deneyin


1
5 bayt ile L<!zO.
Grimmy

3

Pyke, 10 bayt

FSBQi^R/)s

Burada deneyin!

Veya güç = 1 ise 8 bayt

FSB1R/)s

Burada deneyin!


koştuğumda ilk kod 3'ten fazla kapalıydı: 5.436532738095238
tox123 21

@ tox123 düzeltildi
Blue

bunları test ediyor musun? Ben aldım: Birincisi için 7.3887125220458545, ikincisi çok daha iyi çalışıyor.
tox123

Bu sadece tanımadığın bir e ^ x biri
Blue

zorluk bu değil.
tox123

3

JavaScript (ES6), 28 bayt

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

3

Dyalog APL , 6 bayt

+/÷!⍳⎕

+/0 ile 0 arasındaki sayıların faktöriyellerinin
÷karşılıklarının toplamı
!

sayısal girdiye

⎕IO←0Birçok sistemde varsayılan olan varsayımdır .

TryAPL !


3

Haskell, 37 bayt

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

En kısa değil, ama tartışmasız en güzel.


Ayrıca Laikoni'nin izniyle , burada 2 bayt daha kısa bir çözüm var :

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
Sen kullanabilirsiniz Bu UTF-8 bayt sayacı . Bayt sayınızı eklemek için önerilen bir düzenleme yaptım, yani 50. Bir başlık eklemek için kullanın: ## Language, <xxx> bytes.
NoOneIsHere

1
Boşluğa mı ihtiyacınız var?
NoOneIs Here

1
Girdinin bir değişkende bulunduğunu varsayamazsınız, bu nedenle geçerli bir işlev gönderimi eklemeniz f n=veya almanız gerekir \n->. Ancak, biz de birkaç byte kaydedebilirsiniz: (\x->1/x)bölümüne kısaltılabilir (1/), [1,2..]aynıdır [1..]ve map(...)$olabilir (...)<$>. Birlikte 36 bayt: Çevrimiçi deneyin!
Laikoni

1
Noktasız bir işleve dönüştürmek başka bir bayt tasarrufu sağlar: Çevrimiçi deneyin! Ve bir bayt daha uzun olsa da, ((scanl(+)0$(1/)<$>scanl(*)1[1..])!!)güzel görünüyor.
Laikoni

1
Kendinizi gördüğünüz gibi, parantez içermeyen sürüm yalnızca geçerli bir Haskell ifadesidir, bu değerden sonra bir değer eklenirken, ancak önceden tanımlanmış bir değişkente var olan girdiye izin verilmediği varsayıldığında , parantez eklemeniz veya yeniden \n->oluşturmak için bir işlev.
Laikoni

3

APL (Dyalog Unicode) , 5 bayt

⍳⊥⊢÷!

Çevrimiçi deneyin!

Bulunan karışık taban hile kullanarak cevabım ait başka meydan . Kullanır ⎕IO←0.

Nasıl çalışır

⍳⊥⊢÷!  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 temsilcisi! Şimdi Turing Machine bunu çekip çekemeyeceğimizi görmek için ....
ouflak

Güzel cevap ama 1÷(n-1)!basamağın nasıl olduğunu görmekte zorlanıyorum ? Açıklığa kavuşturmak için J'ye çevirebilir misiniz?
Jonah

2

Aslında, 6 bayt

r♂!♂ìΣ

Çevrimiçi deneyin!

Açıklama:

r♂!♂ìΣ
r       range(N) ([0, N-1])
 ♂!     factorial of each element
   ♂ì   reciprocal of each element
     Σ  sum

2

Brachylog , 18 bayt

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

açıklama

: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

Akçaağaç, 18

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

Kullanımı:

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

Bence fonksiyon n-> add (1 / i!, İ = 0..n-1)
RosLuP


2

On Ayak Lazer Kutuplu Java , 238236 bayt

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);}}

Diğer cevapların çoğundan daha iyi taşma direncine sahiptir. 100 terim için sonuç

31710869445015912176908843526535027555643447320787267779096898248431156738548305814867560678144006224158425966541000436701189187481211772088720561290395499/11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364608000000000000000000000

2

Julia, 28 bayt

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

açıklama

~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)pozitif tamsayı girişleri için eşittir ve negatif olmayan tamsayılar dışındaki tüm değerler için genelleştirir. Bir bayt kaydeder, neden kullanmıyorsunuz?


1

MATLAB / Oktav, 22 bayt

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

ansKullanarak çağrılabilecek adsız bir işlev oluştururans(N) .

Bu çözüm gamma(x), [1 ... N] dizisindeki eşit olan her eleman için hesaplar factorial(x-1). Daha sonra her bir elemanın tersini alır ve tüm elemanları toplarız.

Çevrimiçi Demo


1

Perl 5, 37 bayt

Kazanan değil, güzel ve anlaşılır:

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

0 ile 10 arasındaki girişler için çıkışlar:

1
2
2.5
2.66666666666667
2.70833333333333
2.71666666666667
2.71805555555556
2.71825396825397
2.71827876984127
2.71828152557319
2.71828180114638

1

R, 17 bayt

sum(1/gamma(1:n))

Sayısal kesinlik sorunları zamanın belli bir noktasında ortaya çıkmasına rağmen, oldukça basittir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.