円周率の500桁を計算する

円周率の最初の500桁を計算するプログラムを作成し、以下のルールを満たします。

  • 長さは500文字未満である必要があります。
  • 「pi」、「math.pi」、または同様のpi定数を含めることはできません。また、円周率を計算するためにライブラリ関数を呼び出すこともできません。
  • 「3」、「1」、「4」の数字を連続して使用することはできません。
  • 最新のコンピューターでは、妥当な時間(1分未満)で実行する必要があります。

最短のプログラムが優先されます。

コメント

  • 数字が正しいかどうかを確認するには: eveandersson.com/pi/digits
  • 最初の500桁を超えると、精度が低下して500桁を超える数字を印刷できますか?
  • @ Alexandru、Iそうだと思いますが、切り捨てて表示したいと思います。
  • HTTPライブラリを使用して、”の円周率”ウェブサイト? 😉
  • Pythonでpiの任意の長さの近似値を生成するための、すてきで簡潔なものを取得したいと思ってここに来ました…残念ながら@Soulman ‘のPythonソリューションはどうやら500桁に調整されています。 500を1000に置き換えると、間違った答えが返されます。任意の桁数を生成するのに一般的に役立つ短い関数を生成する代替チャレンジを表現する良い方法があるのだろうか?

回答

Golfscript-29文字

6666,-2%{2+.2/@*\/9)499?2*+}* 

後で分析を投稿します

コメント

  • これがどのように機能するか説明していただけますか?
  • “後で分析を投稿します”。 (3年間待ちます)…
  • “後で分析を投稿します” *もっと待つ6年以上*
  • “後で分析を投稿します”(8年待ちます)
  • まだ待っています…

回答

Mathematica(34文字):(「不正行為」なしwith trig)

N[2Integrate[[1-x^2]^.5,-1,1],500]

では、ここで魔法を説明します:
Integrate[function, lower, upper]は、「下」から「上」までの曲線「関数」の下の領域を示します。この場合、その関数は[1-x^2]^.5です。これは、半径1の円の上半分を表す式です。円の半径は1であるため、 xの値が-1未満または1より大きいため、円の半分の領域が見つかります。 2を掛けると、半径1の円の内側の面積が得られます。これは円周率に等しくなります。

コメント

  • おそらくあなたあなたの答えに、なぜこれが機能するのかについての説明を挿入する必要があります(彼らにとっては数学以外の人々)。
  • 素晴らしいアイデア。私は今それを見ます。 ‘関連する数学の基本的な説明をします。
  • 短くすることもできます:sqrt[1-x^2]を次のように変更します。 (1-x^2)^.5)
  • 2。Mathematicaの後に*を削除できます。

回答

Python(83文字)

P=0 B=10**500 i=1666 while i:d=2*i+1;P=(P*i%B+(P*i/B+3*i)%d*B)/d;i-=1 print"3.%d"%P 

回答

28 25 24バイト

i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70 

オンラインでお試しください!

を使用して有理数としてpiの値を計算します無限級数の最初の5000項2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))、次に最初の500桁を抽出します。

指定された数の項からpiの値を計算するコードはわずか13バイト(ΣG*2mṠ/o!İ1→ḣ):

ΣG*2mṠ/o!İ1→ḣ Σ # the sum of G*2 # the cumulative product, starting at 2, of m # mapping the following function to all terms of ḣ # series from 1 to ... (whatever number is specified) Ṡ/ # divide by x o! → # element at index -1 İ1 # of series of odd numbers 

残念ながら、数値を指定して3バイトを無駄にする必要があります使用する用語の例:

□70 # 70^2 = 4900 

さらに8バイトで、有理数(分数で表される)を10進数形式の数字に変換します。

i*!500İ⁰ i # integer value of * # multiplying by !500 # 500th element of İ⁰ # series of powers of 10 

回答

PARI / GP、14

\p500 acos(-1) 

置き換えることで、トリガーを回避できます2行目

gamma(.5)^2 

または

(6*zeta(2))^.5 

または

psi(3/4)-psi(1/4) 

または

4*intnum(x=0,1,(1-x^2)^.5) 

または

sumalt(k=2,(-1)^k/(2*k-3))*4 

回答

Python3 136

マダバを使用式。

from decimal import * D=Decimal getcontext().prec=600 p=D(3).sqrt()*sum(D(2-k%2*4)/3**k/(2*k+1)for k in range(1100)) print(str(p)[:502]) 

Python3 164

これを使用式。

from decimal import * D=Decimal getcontext().prec=600 p=sum(D(1)/16**k*(D(4)/(8*k+1)-D(2)/(8*k+4)-D(1)/(8*k+5)-D(1)/(8*k+6))for k in range(411)) print(str(p)[:502]) 

回答

Mathematica(17バイト)

N[ArcCos[-1],500] 

有効性の証明

回答

Pyth 、21

u+/*GHhyHy^T500r^3T1Z 

次のアルゴリズムを使用します:Golfscriptの回答のコメントにあるpi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))

コメント

  • これは反対票に値する’ではありません…
  • この回答は正しくありません。34247779が生成されます。 ..私の知る限り、これはpiではありません。
  • @orlp r操作は最近、この答えを破る方法で変更されました。 10に変更すると、現在のPythで機能します。

回答

JavaScript、60バイト

i=1n;p=x=3n*(10n**520n);while(x=x*i/(i*4n+4n)){i+=2n;p+=x/i} 

オンラインでお試しください!

コメント

  • 62バイト:for(i=1n,p=x=3n*(10n**520n);x>0;x=x*i/(i*4n+4n),p+=x/(i+=2n));

回答

bc -l(22 = 5コマンドライン+17プログラム)

scale=500 4*a(1) 

コメント

  • ルールには”と記載されており、ライブラリ関数を呼び出すこともできません。 piを計算するには”
  • @Peter私が推測する問題は、”ライブラリ関数”は必ずしも明確に定義された用語ではなく、Pi ” divを計算するために”と言った場合にのみ悪化します>、たとえば、Alexandru

    の答え。

  • atanは1 / 4piを計算するため、これは不正行為だと思いますが、それでも興味深い解決策です。
  • @Thomas O :これが不正行為である場合、’の制限はどこにありますか?
  • このような回答があるため、トリガー機能は禁止されているはずです。アイデアは、組み込み関数ではなく、アルゴリズムを使用して円周率を計算することです。 sqrtは、’がトリガー関数ではないため、少し異なります。

回答

Mathematica-50

½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½] 

回答

Java 10 、 208 207 206 193バイト

 n->{var t=java.math.BigInteger.TEN.pow(503).shiftLeft(1);var p=t;for(int i=1;t.compareTo(t.ZERO)>0;p=p.add(t=t.multiply(t.valueOf(i)).divide(t.valueOf(i-~i++))));return(p+"").substring(0,500);}  

@ceilingcat のおかげで14バイト。

オンラインでお試しください。

または完全なプログラム(245バイト)として:

 interface M{static void main(String[]a){var t=java.math.BigInteger.TEN;var p=t=t.pow(503).shiftLeft(1);for(int i=1;t.compareTo(t.ZERO)>0;p=p.add(t))t=t.multiply(t.valueOf(i)).divide(t.valueOf(i-~i++));System.out.print((p+"").substring(0,500));}}  

オンラインでお試しください。

回答

公理、80バイト

digits(503);v:=1./sqrt(3);6*reduce(+,[(-1)^k*v^(2*k+1)/(2*k+1)for k in 0..2000]) 

参照用 https://tuts4you.com/download.php?view.452 ;これは6 * arctg(1 / sqrt(3))=%piに近似し、arctgにセリエ展開を使用します

 3.1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 592307816 4 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 505822317 2 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 442881097 5 6659334461 2847564823 3786783165 2712019091 4564856692 3460348610 454326648 2 1339360726 0249141273 7245870066 0631558817 4881520920 9628292540 917153643 6 7892590360 0113305305 4882046652 1384146951 9415116094 3305727036 575959195 3 0921861173 8193261179 3105118548 0744623799 6274956735 1885752724 891227938 1 8301194913 01 

回答

05AB1E 、20 バイト

₄°·D.ΓN>*N·3+÷}O+₄;£ 

私のJava回答のポート(5031000に置き換えられました-最初の出力には \ $ \ geq503 \ $ であれば何でも問題ありませんこのアプローチでは正確に500桁)。

オンラインで試すまたは確認する ” ■組み込みのžs を使用したPIの最初の500桁に等しい。

説明:

 ₄° # Push 10**1000 · # Double it to 2e1000 D # Duplicate it .Γ # Loop until the result no longer changes, # collecting all intermediate results # (excluding the initial value unfortunately) N> # Push the 0-based loop-index, and increase it by 1 to make it 1-based * # Multiply this 1-based index to the current value N· # Push the 0-based index again, and double it 3+ # Add 3 to it ÷ # Integer-divide the (index+1)*value by this (2*index+3) }O # After the cumulative fixed-point loop: sum all values in the list + # Add the 2e1000 we"ve duplicated, which wasn"t included in the list ₄; # Push 1000, and halve it to 500 £ # Leave the first 500 digits of what we"ve calculated # (after which it is output implicitly as result)  

回答

Fortran、154バイト

ロゼッタコードソリューション。 writeの代わりに暗黙の整数i j k l m nprintを使用して多くのバイトを節約し、物事をシャッフルしました周り

オンラインで試す…

 integer,dimension(3350)::v=2;x=1E5;j=0 do n=1,101;do l=3350,1,-1 m=x*v(l)+i*l;i=m/(2*l-1);v(l)=m-i*(2*l-1);enddo k=i/x;print"(I5.5)",j+k;j=i-k*x;enddo end  

回答

APL(NARS2000)、20バイト

{2+⍵×⍺÷1+⍨2×⍺}/⍳7e3x 

これをテストできませんでしたが、ここに DyalogAPLのバージョンがあります。それらの唯一の違いは、接尾辞” x “です。これは、NARS2000の有理数に使用されますが、Dyalog(または私の知る限り、他の亜種はオンラインで入手できます。

これは、承認されたGolfscriptの回答の下にあるコメントのpi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))式に基づいています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です