Pi計算コードゴルフ[終了]


17

チャレンジ

可能な限り短い長さでpiを計算する必要があります。どの言語でも参加できます。また、円周率の計算には任意の式を使用できます。少なくとも小数点以下5桁までのpiを計算できる必要があります。最短、文字で測定されます。競争は48時間続きます。ベギン。


この同様の質問は、PIはシリーズ4 *(1 – 1/3 + 1/5 – 1/7 +…)を使用して計算する必要があることを示しています。この質問にはこの制限はありません。実際、ここでの多くの回答(勝つ可能性が最も高いものを含む)は、他の質問では無効になります。したがって、これは複製ではありません。


5
@hvdなぜ失格とすべきだと思いますか?これはスペック...フィット
博士ベリサリウス

5
@hvd acos(-1)。私の勝ち!
レベルリバーセント14

4
これは奇妙で一貫性がありません。π計算するには、円を直径で割るか、πを与える他の演算を行う必要があります。@aceのように355/113を行うことを受け入れる場合-運以外のπとは関係ありません-論理的には3.14159を受け入れる必要があります。
ニコラスバルブレスコ14

7
人々がこの質問を好む理由がわかりません。これは、私がここで見た中で最も不明確で面白くない質問の1つです。この世界とhello worldの唯一の違いは、これがPiと関係があるということです。
ランチャー14

8
この質問を面白くするためには、コードのバイトごとにpiの桁に報酬を与えるスコアリング関数が必要です。
ベンジャクソン14

回答:


56

Python3、7

対話型シェルで実行します

355/113

出力:3.1415929203539825、小数点以下6桁に修正

そして最後に、APLに勝るソリューションがあります!

ああ、あなたが疑問に思っている場合、この比率は密率(文字通り「正確な比率」)と呼ばれ、中国の数学者Zu Chongzhi(429-500 AD)によって提案されています。関連するウィキペディアの記事はこちらにあります。Zuは22/7の比率を「大まかな比率」として与え、3.1415926 <= pi <= 3.1415927を提案した最初の数学者であることが知られています。


12
mhmh-それは実際には多言語回答です。Smalltalkでも動作します!
blabla999 14

7
冒涜!それはかろうじて計算です!
mniip 14

3
まあ、それは部門であり、その精度は要件を満たします...(そして、聖書さえ正確ではありません;あなたはその冒とくをラベル付けしないでしょう-あなたは?3 * ;
blabla999 14

29
冗談のようにぎこちない私は深刻な答えとしてこれを書いた瞬間みんなの解釈、それ...
user12205

20
最も高い投票数の回答:355/113。最も投票数の少ない回答:3+.14159。あまり違いはありません、本当に。
primo 14

49

PHP — 132 127 125 124バイト

基本的なモンテカルロシミュレーション。10Mの反復ごとに、現在のステータスを出力します。

for($i=1,$j=$k=0;;$i++){$x=mt_rand(0,1e7)/1e7;$y=mt_rand(0,1e7)/1e7;$j+=$x*$x+$y*$y<=1;$k++;if(!($i%1e7))echo 4*$j/$k."\n";}

cloudfeetとzamnutsの提案に感謝します!

サンプル出力:

$ php pi.php
3.1410564
3.1414008
3.1413388
3.1412641
3.14132568
3.1413496666667
3.1414522857143
3.1414817
3.1415271111111
3.14155092
...
3.1415901754386
3.1415890482759
3.1415925423731

5
実際に計算する答えを探してください!
blabla999 14

PHPについては知りませんが、JSでは次のようなことができます:$j+=$x*$x+$y*$y<=1;4バイト節約できます。
cloudfeet 14

1
また、$k+=1/4;print $j/$kに減少させることができた$k++;し、print 4*$j/$k別のバイトのために。
cloudfeet 14

@cloudfeet-行われた変更、確認されたコードは引き続き同じように動作します。ありがとうございました!

2
@MarkC-概念的には、ダーツを0,0から1,1の長方形にランダムに投げています。0,0から距離1以下の距離は内部、それ以外は外部と見なされます。この距離1の形状は、たまたま1/4円またはπ/ 4です。[クォーターサークル内のダーツの数] / [ダーツの合計数]は、サンプル数が増えるにつれておよそπ/ 4になります。

31

J 6

{:*._1

説明:*.複素数の長さと角度を示します。-1の角度はpiです。{:リストの末尾を取ります[長さ、角度]

ゆっくりと収束するシリーズのフェティストのために、21バイトの場合、ライプニッツシリーズ:

      +/(4*_1&^%>:@+:)i.1e6
 3.14159

12
つまり、これはatan(0) + piです。三角関数とpi自体の使用は「計算」としてカウントされるべきではないと思います。
ジェイソンC 14

@JasonC Arg(すなわち、複素数の引数である)の逆正接と同様の値を有するにもかかわらず、三角関数ではない
mniip

1
@mniip はい、そうです。これは、実部と虚部のatan(atan2)の同義語です。ご覧のとおり、定義上、これは正確に等しいatan(0) + piです。
ジェイソンC 14


19

ピート、多くのコーデル

私の答えではありませんが、これは私がこの問題に対して見た最高の解決策です:

Pi approximation in Piet

私の理解では、円内のピクセルを合計し、半径で除算してからもう一度計算します。あれは:

A = πr²  # solve for π
π = A/r²
π = (A/r)/r

私の考えでは、このイメージを任意のサイズで生成し、それをPietインタープリターで実行するプログラムがより良いアプローチです。

ソース:http : //www.dangermouse.net/esoteric/piet/samples.html


それが実際に何をするのか説明できますか?(私はPietの背後にある一般的なアイデアを知っていますが、この特定のプログラムがどのように機能するかについての説明は、あなたの答えへの素晴らしい追加になるでしょう)。
プランナパス14

私は実際にピートを知らないが、私は、これは文字通り赤い円の面積を測定し、その後、半径の2倍で割りだと思い、π= A /(R * R)について解く
未チャールズいること

ポインターが赤い円に入ると、赤い領域内のコーデルの数をカウントし、終了するときにスタックにプッシュするため、エリアは非常に明確です)、それは私が理解するのに苦労した「半径の二乗で割る」部分です。
plannapus 14

1
@plannapus半径は、左上隅から左端の途中まで伸びる濃い赤の線で「ハードコード化」されています(画像では見えにくい)。Pietを追跡するのは難しいですが、要点は面積と等しい値を持つ色のブロックであり(左端の線にはrピクセルがあり、円には面積ピクセルがあります)、その間のものは単なるスタックと算術演算の束です。プログラムは左上から始まります。右上のテキストは基本的にコメントです。
ジェイソンC 14

2
@JasonCああもちろん!円は上側と下側の両方に接しているため、上側から正確な中央まで下がっている暗い赤色の線は半径が必要です!スマート!
plannapus 14

18

技術的に計算しています、9

0+3.14159

技術的にはまだ計算しています、10

PI-acos(1)

私はハードに計算しています、8

acos(-1)

私は偶然PI、12

"3.14"+"159"

そして技術的には、この答えは悪臭を放ちます。


31
ヘッダー、非常に大きなタイトル、目にとって非常に苦痛、すごい。
ピエールアラウド14

1
多くのlulz、thankzのpluzz wan
ジョナサンヴァンMatre

ちょっと赤ちゃん、私のテイラーシリーズを展開したいですか?
ジェイソンC 14


@SimonTテイラーシリーズに関する私の質問には答えませんでした。しかし、あなたがそれについて考えている間に、質問に対する私のコメントと他のほとんどの答えをここで見てください。:P
ジェイソンC

14

APL-6

2ׯ1○1

出力3.141592654。1のアークサインの2倍を計算します。

13文字のソリューションは次のようになります。

--/4÷1-2×⍳1e6

これ3.141591654は私に出力され、要求された精度に適合します。ただし
、単純な+ 4/1 - 4/3 + 4/5 - 4/7 ...シリーズを使用して計算します。


1
うわー、それは1つの遅い収束です!

私が最初に考えたのは「なぜ¯2○¯1?」(つまり、acos -1)でした。しかし、それはrepl.it(3.1415926425236J¯1.1066193467303274e¯8)に複雑な近似を与えます。理由は何ですか?すべての実装はそれを行いますか?
ジェームズウッド14

2番目のソリューションの+1。2 * asin(1)しかし、ちょっとした詐欺です。
ジェイソンC 14

@JamesWood私はAPLを知りませんが、推測する必要がある場合sqrt(1-theta^2)、ある時点で(多くのトリガーIDでポップアップする)しようとし、どこかで精度を失い、わずかに負になりました1-theta^2
ジェイソンC 14

1
奇妙なのは、まだ小さな想像上の部分があることですacos -0.751 - 0.75 ^ 2負になると計算する方法はありません。
ジェームズウッド14

14

J-5バイト

|^._1

これはを意味し|log(-1)|ます。


オイラーのアイデンティティの巧妙な使用。
primo 14

1
クールな、代数的アイデンティティの答え。ln(e^(42*pi))/42またはと同じくらい賢いpi*113/113
ジェイソンC 14

TI-BASICでも動作します
Timtech 14

1
(まったく無関係です。codegolfでLaTeXを使用できるといいのですが。)
ジェイソンC 14

1
(まったく関係のない質問への回答、私はここで例えばグーグルチャートでうまくいきます。)トピックについては、これは最もソートされた答えであり、したがって受け入れられるべきでした。
primo 14

14

Google Calculator、48

stick of butter*(26557.4489*10^-9)/millimeters^3

バターを一本取り、高度な計算を行い、パイを作ります。他のみんなが簡単な数学の答えをしていたので、もう少しユニークなものを追加すると思いました。


3
stick of butterかわいいと面白いですが、これは、本質的にさらに別のあるpi*x/x+y-y代数的アイデンティティ。
ジェイソンC 14

10
バターの棒を使用してパイを作成するための非常に多くのより良い方法があります
チャールズではありませんチャールズ

あなたはパイの棒でバターを作ってみましたか?
mbomb007

12

オクターブ、31

quad(inline("sqrt(4-x^2)"),0,2)

数値積分により、半径2の円の4分の1の面積を計算します。

octave:1> quad(inline("sqrt(4-x^2)"),0,2)
ans =     3.14159265358979

1
いいね!票がリチャージすると+1。
ジェイソンC 14


10

Python、88

解決 :

l=q=d=0;t,s,n,r=3.,3,1,24
while s!=l:l,n,q,d,r=s,n+q,q+8,d+r,r+32;t=(t*n)/d;s+=t
print s

Pythonシェルのサンプル出力:

>>> print s
3.14159265359

インポートを回避するために管理します。任意の精度のDecimalライブラリを使用するために簡単に交換できます。単にに置き換え3.Decimal('3')、前後に精度を設定し、単項プラス結果に精度を変換します。

そして、ここでの回答の全体の多くとは異なり、実際に計算の代わりに頼るのでπ組み込み定数または数学の贋作、すなわちmath.acos(-1)math.radians(180)など


9

x86アセンブリ言語(5文字)

fldpi

ただし、これがROMから定数を読み込むか、実際に答えを計算するかは、プロセッサによって異なります(ただし、少なくとも一部では、ROMから数値を読み込むだけでなく、実際に計算を行います)。物事を概観すると、387で40クロックサイクルかかることがリストされています。これは、ROMから値をロードするだけの場合よりも理にかなっているようです。

あなたが本当に計算を確実にしたいなら、あなたは次のようなことをすることができます:

fld1
fld1
fpatan
fimul f

f dd 4

[27文字の場合]


1
説明してください。
ニコラスバルブレスコ14

また、一部のプロセッサでは、計算はfldpiどうなりますか?
ニコラスバルブレスコ14

1
私はpiをロードする(または他の誰かのasin実装または既存のトリガー関数実装に基づいてそれを計算する)コマンドを使用して、実際に何かを「計算する」という精神でカウントするとは思わない(「omgアセンブラー」ファクターはtは本当にそれを変更します)。おそらくこれを最短のアセンブラー実装に移植し、「計算」と呼ぶことができます。
ジェイソンC 14

2
@JasonC:私は完全にarbitrary意的な概念のように聞こえますが、それらを使用する場合は、人々が加算、減算、乗算、除算を自分で実装しなければならないと私が判断する以上に、本当の意味はありません。
ジェリーコフィン14

3
@JerryCoffin専門性を主張する代わりに、特に興味深くも創造的でもasin(-1)ないというだけで十分ですfldpi。事前に定義されたトリガー関数とpi定数の最も短い名前を持つお気に入りの言語を確認するために競合することには、あまり目的がありません。
ジェイソンC 14

8

bc -l、37バイト

for(p=n=2;n<7^7;n+=2)p*=n*n/(n*n-1);p

Wallis製品を使用した他の回答は見当たらないので、私の名前にちなんで名付けられたので(数学の歴史の講師がそれを大いに活用しました)、抵抗できませんでした。

ゴルフの観点からはかなり良いアルゴリズムであることが判明しましたが、収束速度はひどく、小数点以下5桁を得るために100万回の反復に近づいています。

$ time bc -l<<<'for(p=n=2;n<7^7;n+=2)p*=n*n/(n*n-1);p'
3.14159074622629555058

real    0m3.145s
user    0m1.548s
sys 0m0.000s
$ 

bc -l、15バイト

あるいは、Newton-Raphsonを使用sin(x)=0して、開始近似3でを解くことができます。これはごく少数の反復で収束するため、2つの反復を単純にハードコーディングします。

x=3+s(3);x+s(x)

ニュートンラプソンによる反復式は次のとおりです。

x[n+1] = x[n] - ( sin(x[n]) / sin'(x[n]) )

sin'=== cosおよびcos(pi)=== -1なのでcos、取得する用語を近似するだけです。

x[n+1] = x[n] + sin(x[n])

出力:

$ bc -l<<<'x=3+s(3);x+s(x)'
3.14159265357219555873
$ 

+1のようになりました!
ジェイソンC 14

@JasonC sin(x)= 0(編集を参照)を解くためのニュートンラプソンの適用についてのあなたの意見は何ですか?
デジタル外傷

6

python- 47 45

piは、実際にはトリガー関数または定数なしで計算されています。

a=4
for i in range(9**6):a-=(-1)**i*4/(2*i+3)

結果:

>>> a
3.1415907719167966

強制浮動小数点解釈のために小数点以下のゼロをドロップすることにより、バイトを保存できる必要があります。:)簡潔さのためにボーナスポイントが、私は任意の精度と低いメモリ使用率の私のものが好きです。(括弧の考えをスクラッチするために編集されました。そこで何が起こっているのかを確認し、分離テストは問題をキャッチしませんでした。)
amcgregor 14

ええと…いや。変更後、有効な出力が得られなくなります。(265723ππ)末尾のゼロではなく、ピリオドが必要です。
amcgregor

@amcgregorはpython 3を使用しますか?
qwr 14

私は主に2.7未満で開発し、コードを両方で動作させるようにします。ただし、ストックMac 10.9 python3インストールでは、コードによりセグメンテーションエラーが発生します。
amcgregor 14

@amcgregor私はちょうどそれをテストし、それは私の作品(のpython 3.3.4)
QWR

6

C、99

円の面積/ r ^ 2を直接計算します。

double p(n,x,y,r){r=10000;for(n=x=0;x<r;++x)for(y=1;y<r;++y)n+=x*x+y*y<=r*r;return(double)n*4/r/r;}

この関数は、半径の円内のピクセル数をカウントしてpiを計算し、r次に除算しますr*r(実際には1つの象限を計算するだけです)。でr10000として、それは小数点以下5桁(3.1415904800)に正確です。関数へのパラメーターは無視され、スペースを節約するためにそこで宣言しただけです。


6

Javascript、43 36

x=0;for(i=1;i<1e6;i++){x+=1/i/i};Math.sqrt(6*x)

xzeta(2)=pi^2/6そうなりsqrt(6*x)=piます。(47文字)

分配プロパティを使用し、forループから中括弧を削除すると、次の結果が得られます。

x=0;for(i=1;i<1e6;i++)x+=6/i/i;Math.sqrt(x)

(43文字)

戻り値:

3.14159169865946

編集:

Wallis製品を使用してさらに短い方法を見つけました。

x=i=2;for(;i<1e6;i+=2)x*=i*i/(i*i-1)

(36文字)

戻り値:

3.141591082792245

6

Python、リーマンゼータ(58 41文字)

(6*sum(n**-2for n in range(1,9**9)))**0.5

または2文字をspareしまないが、scipyを使用する

import scipy.special as s
(6*s.zeta(2,1))**0.5

編集amcgregorのおかげで16(!)文字を保存


1
代わりにべき乗にピボットすることで、潜在的にmathインポートとsqrt呼び出しを回避できます(6*sum(n**-2 for n in range(1,9**9)))**0.5
。– amcgregor

5

Javascript:99文字

1996年にSimon Plouffeによって与えられた式を使用すると、これは小数点以下6桁の精度で機能します。

function f(k){return k<2?1:f(k-1)*k}for(y=-3,n=1;n<91;n++)y+=n*(2<<(n-1))*f(n)*f(n)/f(2*n);alert(y)

This longer variant (130 characters) has a better precision, 15 digits after the decimal point:

function e(x){return x<1?1:2*e(x-1)}function f(k){return k<2?1:f(k-1)*k}for(y=-3,n=1;n<91;n++)y+=n*e(n)*f(n)*f(n)/f(2*n);alert(y)

I made this based in my two answers to this question.


5

Ruby, 54 50 49

p (0..9**6).map{|e|(-1.0)**e/(2*e+1)*4}.reduce :+

Online Version for testing.

Another version without creating an array (50 chars):

x=0;(0..9**6).each{|e|x+=(-1.0)**e/(2*e+1)*4}; p x

Online Version for testing.


It's interesting to see the language differences that such compact solutions can give. For example, the Python translation of the above is 105 characters (after using some trivial code compression tricks): a=__import__;reduce(a('operator').__add__,a('itertools').imap(lambda e:(-1.0)**e/(2*e+1)*4,xrange(9**6))) -- note the use of xrange/imap; in Python 3 you can avoid this; basically I don't want all of your RAM to get consumed constructing a list with so many entries.
amcgregor

1
You're absolutely right. It is often very convenient to use (especially Ruby's) Array and Enumerable functions, though it might really not be the best idea in terms of performance and speed... Well, thinking about that, it should be possible to do the calculation with the Range.each method instead of creating a map.
David Herrmann

Yes, it's possible - just one character more...
David Herrmann

Your first answer is not as precise as your second.
Josh

Could you elaborate, please? Same algorithm, same output for me?
David Herrmann

5

TI CAS, 35

lim(x*(1/(tan((180-360/x)/2))),x,∞)

1
I looked back at this and i completely forget how it works :P
TheDoctor

5

Perl - 35 bytes

$\=$\/(2*$_-1)*$_+2for-46..-1;print

Produces full floating point precision. A derivation of the formula used can be seen elsewhere.

Sample usage:

$ perl pi.pl
3.14159265358979

Arbitrary Precision Version

use bignum a,99;$\=$\/(2*$_-1)*$_+2for-329..-1;print

Extend as needed. The length of the iteration (e.g. -329..-1) should be adjusted to be approximately log2(10)3.322 times the number of digits.

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211707

Or, using bigint instead:

use bigint;$\=$\/(2*$_-1)*$_+2e99for-329..-1;print

This runs noticably faster, but doesn't include a decimal point.

3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

5

C# 192

class P{static void Main(){var s=(new System.Net.WebClient()).DownloadString("http://www.ctan.org/pkg/tex");System.Console.WriteLine(s.Substring(s.IndexOf("Ver&shy;sion")+21).Split(' ')[0]);}}

Outputs:

3.14159265

No math involved. Just looks up the current version of TeX and does some primitive parsing of the resulting html. Eventually it will become π according to Wikipedia.


I'm 5 years late, but this is a standard loophole that was created 4 days before this answer.
Benjamin Urquhart

5

Python 3 Monte Carlo (103 char)

from random import random as r
sum(1 for x,y in ((r(),r()) for i in range(2**99)) if x**2+y**2<1)/2**97

5

Game Maker Language, 34

Assumes all uninitialized variables as 0. This is default in some versions of Game Maker.

for(i=1;i<1e8;i++)x+=6/i/i;sqrt(x)

Result:

3.14159169865946

very nice. also, in C float k(){double x=0,i=0;for(;i++<999999;)x+=6/i/i;return sqrt(x);} is shorter than this one
izabera

even shorter with 1e8 instead of 999999
izabera

Could you use for(i=1;i<1e8;)x+=6/i/i++;sqrt(x) to save a byte (or alternatively for(i=1;i++<1e8;))?
mbomb007

@mbomb007 Unfortunately not, GML requires all 3 parameters.
Timtech

4

Java - 83 55

Shorter version thanks to Navin.

class P{static{System.out.print(Math.toRadians(180));}}

Old version:

class P{public static void main(String[]a){System.out.print(Math.toRadians(180));}}

This doesn't do any calculation.
Hosch250

I don't understand the downvote, although - I'd answered with "Math.toRadians(180)". It is also questionable, who computes pi: the compiler or the program. But that was not part of the question.
blabla999

2
@user2509848 It most certainly does: it multiplies 180 by pi/180.
AJMansfield

You mean it multiplies pi by 1? It is essentially the same thing. I did not downvote it, but I don't think it really counts.
Hosch250


4

R: 33 characters

sqrt(8*sum(1/seq(1,1000001,2)^2))
[1] 3.141592

Hopefully this follows the rules.


3

Ruby, 82

q=1.0
i=0
(0.0..72).step(8){|k|i+=1/q*(4/(k+1)-2/(k+4)-1/(k+5)-1/(k+6))
q*=16}
p i

Uses some formula I don't really understand and just copied down. :P

Output: 3.1415926535897913


3

Ruby, 12

p 1.570796*2

I am technically "calculating" pi an approximation of pi.


No, you are not technically calculating pi. You are technically calculating 3.141592, which happens to be close to pi, but will never converge to exactly acos(-1).
wchargin

@Wchar Ok, edited
Doorknob

3
I don't think hard-coding pi/2 then multiplying it by 2 really counts; the point is to calculate pi, not obfuscate a numeric literal.
Jason C

3

JavaScript - 19 bytes

Math.pow(29809,1/9)

Calculates the 9th root of 29809.

3.1415914903890925
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.