eで表される、変数xの累乗に対するオイラーの数は、Maclaurin級数展開を使用して近似できることは誰もが知っています。
xを1に等しくすることにより、
チャレンジ
入力Nを取り込み、N番目の項までの系列を計算することにより、オイラーの数を近似する任意の言語でプログラムを作成します。最初の項の分母は0!であり、1!ではないことに注意してください。つまり、N = 1は1/0!に対応します。
得点
最小バイト数のプログラムが優先されます。
eで表される、変数xの累乗に対するオイラーの数は、Maclaurin級数展開を使用して近似できることは誰もが知っています。
xを1に等しくすることにより、
入力Nを取り込み、N番目の項までの系列を計算することにより、オイラーの数を近似する任意の言語でプログラムを作成します。最初の項の分母は0!であり、1!ではないことに注意してください。つまり、N = 1は1/0!に対応します。
最小バイト数のプログラムが優先されます。
回答:
私の最初の本当の哀れなプログラム!実際には、最初のゴルフの長さが短くなったため、someday
代わりに使用して、少しゴルフをしwait 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>
someday i were N...
の代わりに仕事をsomeday i will be N...
?
Ans
有効な入力形式ではないため、15バイトバージョンのみが有効です。
Ans
PPCGでは常にデフォルトの入力形式であり(以前のTIの回答を参照)、反対するよりも同意する人が多いので、答えを変えようとしないでください。
n->sum(1./gamma(1:n))
これは、整数を受け入れ、floatを返す匿名関数です。呼び出すには、変数に割り当てます。
アプローチは非常に簡単です。我々はsum
1を介して1のそれぞれで評価ガンマ関数で割ったN。これは、プロパティnを利用します!=Γ(n +1)。
デニスのおかげで1バイト、グレンO!のおかげで6バイト節約できました。
@(n)sum(1./factorial(0:n))
[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
:Ygl_^s
@Luisの使用推奨gamma
(Yg
)のおかげで4バイト節約
説明
% 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
]
1i:Yg/s
7バイト
#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;
}
反復回数を決定するための引数として数値を取ります。
#include <stdio.h>
((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
f n=
か\n->
、有効な関数サブミットを取得する必要があります。しかし、我々はまた、いくつかのバイトを保存することができます:(\x->1/x)
セクションに短縮することができ(1/)
、[1,2..]
同じである[1..]
とmap(...)$
することができ(...)<$>
。Together 36バイト:オンラインでお試しください!
((scanl(+)0$(1/)<$>scanl(*)1[1..])!!)
見た目もきれいです。
⍳⊥⊢÷!
別の挑戦の私の答えにある混合ベーストリックを使用します。を使用します。⎕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)!
1÷(n-1)!
が、数字がどのように表示されるかわかりません。明確にするためにそれをJに翻訳してもらえますか?
r♂!♂ìΣ
説明:
r♂!♂ìΣ
r range(N) ([0, N-1])
♂! factorial of each element
♂ì reciprocal of each element
Σ sum
: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
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);}}
Has much better overflow resistance than most of the other answers. For 100 terms, the result is
31710869445015912176908843526535027555643447320787267779096898248431156738548305814867560678144006224158425966541000436701189187481211772088720561290395499/11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364608000000000000000000000
~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)
is equal to factorial(k)
for positive integer inputs, and generalizes it for all values other than the nonnegative integers. It saves one byte, so why not use it?
@(x)sum(1./gamma(1:x))
Creates an anonymous function named ans
that can be called using ans(N)
.
This solution computes gamma(x)
for each element in the array [1 ... N] which is equal to factorial(x-1)
. We then take the inverse of each element and sum all elements.
sum(1/gamma(1:n))
Quite straightforward, although numerical precision issues are bound to arise at some point in time.
sum1/k!,0..n
N
有限精度の浮動小数点数を使用する場合、十分に大きな結果が得られます。その振る舞いは受け入れられますか、または結果がN
無限に近づくにつれて徐々に正確になる必要がありますか?