Pi การคำนวณรหัสกอล์ฟ [ปิด]


17

ความท้าทาย

คุณต้องคำนวณไพในระยะเวลาที่สั้นที่สุดที่คุณสามารถทำได้ ทุกภาษายินดีที่จะเข้าร่วมและคุณสามารถใช้สูตรใด ๆ ในการคำนวณ pi จะต้องสามารถคำนวณ pi เป็นทศนิยมอย่างน้อย 5 ตำแหน่ง สั้นที่สุดจะถูกวัดเป็นตัวละคร การแข่งขันใช้เวลา 48 ชั่วโมง เริ่ม.


หมายเหตุ : คำถามที่คล้ายกันนี้ระบุว่าต้องคำนวณ PI โดยใช้ซีรี่ส์ 4 * (1 - 1/3 + 1/5 - 1/7 + …) คำถามนี้ไม่ได้มีข้อ จำกัด นี้และในความเป็นจริงมากคำตอบที่นี่ (รวมทั้งส่วนใหญ่มีแนวโน้มที่จะชนะ) จะเป็นที่ไม่ถูกต้องในคำถามอื่น ๆ ที่ ดังนั้นจึงไม่ซ้ำกัน


5
@hvd ทำไมคุณถึงคิดว่าควรถูกตัดสิทธิ์? เหมาะกับสเป็ค ...
ดร. เบลิซาเรียส

5
@hvd acos (-1) ผมชนะ!
Level River St

4
มันดูแปลกและไม่สอดคล้องกัน การคำนวณπต้องทำการหารวงกลมด้วยเส้นผ่านศูนย์กลางของมันหรือการดำเนินการอื่นที่ให้π ถ้าเรายอมรับการทำ355/113 - ซึ่งมีอะไรจะทำอย่างไรกับπยกเว้นโชค - เช่น @ace แล้วเหตุผลที่เราควรจะยอมรับการทำ3.14159
Nicolas Barbulesco

7
ฉันไม่เข้าใจว่าทำไมคนถึงชอบคำถามนี้ นี่เป็นหนึ่งในคำถามที่ไม่ชัดเจนและไม่น่าสนใจที่สุดที่ฉันเคยเห็นที่นี่ ข้อแตกต่างระหว่างสิ่งนี้กับสวัสดีโลกคือสิ่งนี้มีส่วนเกี่ยวข้องกับ Pi
Cruncher

8
เพื่อทำให้คำถามนี้น่าสนใจมันจำเป็นต้องมีฟังก์ชั่นการให้คะแนนที่ให้ผลตอบแทนเป็นหลักของ pi ต่อไบต์ของโค้ด
Ben Jackson

คำตอบ:


56

Python3, 7

ทำงานในเชลล์เชิงโต้ตอบ

355/113

เอาท์พุท: 3.1415929203539825แก้ไขทศนิยม 6 ตำแหน่ง

และในที่สุดฉันก็มีทางออกที่เอาชนะ APL!

โอ้และในกรณีที่คุณสงสัยอัตราส่วนนี้เรียกว่า ratio 率 (ตัวอักษร "อัตราส่วนที่แม่นยำ") และเสนอโดยนักคณิตศาสตร์ชาวจีน Zu Chongzhi (429-500 AD) บทความวิกิพีเดียที่เกี่ยวข้องสามารถพบได้ที่นี่ ซูยังให้อัตราส่วน 22/7 เป็น "อัตราส่วนคร่าวๆ" และเขาเป็นที่รู้จักในฐานะนักคณิตศาสตร์คนแรกที่เสนอว่า 3.1415926 <= pi <= 3.1415927


12
mhmh - นั่นคือคำตอบที่พูดได้หลายภาษา ทำงานใน Smalltalk ด้วยเช่นกัน!
blabla999

7
ดูหมิ่น! มันเป็นการคำนวณแทบจะไม่!
mniip

3
มันเป็นแผนกและความแม่นยำตรงกับความต้องการ ... (และแม้แต่พระคัมภีร์ก็มีความแม่นยำน้อยกว่าคุณจะไม่ติดป้ายดูหมิ่นว่า - คุณจะได้ไหม 3 * ;-)
blabla999

29
ช่วงเวลาที่น่าอึดอัดใจเมื่อฉันเขียนสิ่งนี้เป็นคำตอบที่จริงจัง แต่ทุกคนตีความว่ามันเป็นเรื่องตลก ...
12205

20
คำตอบที่โหวตมากที่สุด: 355/113. คำตอบที่โหวตต่ำสุด: 3+.14159. ฉันไม่เห็นความแตกต่างมากนัก
โม่

49

PHP - 132 127 125 124 ไบต์

การจำลอง Monte-Carlo ขั้นพื้นฐาน การทำซ้ำทุก ๆ 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

ไม่ทราบเกี่ยวกับ PHP แต่ใน JS คุณสามารถทำสิ่งที่ชอบ$j+=$x*$x+$y*$y<=1;ซึ่งจะช่วยให้คุณประหยัดสี่ไบต์
cloudfeet

1
นอกจากนี้$k+=1/4;และprint $j/$kสามารถลดลงไป$k++;และprint 4*$j/$kอีกไบต์
cloudfeet

@cloudfeet - ทำการเปลี่ยนแปลงรหัสที่ยืนยันแล้วยังคงทำงานเหมือนเดิม ขอขอบคุณ!

2
@MarkC - ตามหลักการแล้วมันจะโยนปาเป้าแบบสุ่มในรูปสี่เหลี่ยมผืนผ้า 0,0 ถึง 1,1 ผู้ที่น้อยกว่าหรือเท่ากับระยะทาง 1 จาก 0,0 ถูกพิจารณาภายในข้างนอก รูปร่างของระยะนี้ 1 เกิดขึ้นเป็นหนึ่งในสี่วงกลมหรือπ / 4 [จำนวนลูกดอกที่อยู่ในวงกลมไตรมาส] / [จำนวนลูกดอกทั้งหมด] จะประมาณπ / 4 เมื่อจำนวนตัวอย่างเพิ่มขึ้น

31

J 6

{:*._1

คำอธิบาย: *.ให้ความยาวและมุมของจำนวนเชิงซ้อน มุมของ -1 คือ pi {:ใช้หางของรายการ [ความยาวมุม]

สำหรับนักเล่นเฟื่องฟูอย่างช้าๆที่บรรจบกันสำหรับ 21 ไบต์ชุด Leibniz:

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

12
ในคำอื่น ๆ atan(0) + piนี้เป็น ฉันไม่คิดว่าการใช้ฟังก์ชั่นตรีโกณมิติและไพเองควรนับเป็น "การคำนวณ"
Jason C

@JasonC Arg(นั่นคืออาร์กิวเมนต์ของจำนวนเชิงซ้อน) ไม่ใช่ฟังก์ชันตรีโกณมิติแม้จะมีค่าคล้ายกับอาร์คแทนเจนต์
mniip

1
@mniip ใช่มันเป็น มันเป็นคำพ้องความหมายสำหรับ atan (ดี, atan2) ในส่วนจริงและจินตภาพ อย่างที่คุณเห็นนั่นมันเท่ากับโดยนิยามไปatan(0) + piแล้ว
Jason C

25

Perl, 42 ไบต์

map{$a+=(-1)**$_/(2*$_+1)}0..9x6;print$a*4

มันคำนวณπโดยใช้สูตร Leibniz :

Leipniz formula

999999 ถูกใช้เป็นที่ใหญ่ที่สุดnเพื่อให้ได้ความแม่นยำของตัวเลขห้าหลักทศนิยม

ผลลัพธ์: 3.14159165358977


ที่นี่หนาว! มันเป็นแรงบันดาลใจให้ฉันเขียนหนึ่งใน Java 8
David Conrad

19

Piet codels มากมาย

ไม่ใช่คำตอบของฉัน แต่นี่เป็นทางออกที่ดีที่สุดที่ฉันเคยเห็นในปัญหานี้:

Pi approximation in Piet

ความเข้าใจของฉันคือมันเพิ่มพิกเซลในวงกลมและหารด้วยรัศมีและจากนั้นอีกครั้ง นั่นคือ:

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

แนวทางที่ดีกว่าในใจของฉันคือโปรแกรมที่สร้างภาพนี้ในขนาดที่กำหนดเองแล้วเรียกใช้ผ่านล่าม Piet

ที่มา: http://www.dangermouse.net/esoteric/piet/samples.html


คุณช่วยอธิบายสิ่งที่มันทำจริงได้หรือไม่ (ฉันรู้แนวคิดทั่วไปเบื้องหลัง Piet แต่คำอธิบายเกี่ยวกับการทำงานของโปรแกรมนี้จะเป็นคำตอบที่ดีสำหรับคุณ)
plannapus

ฉันไม่รู้ Piet จริง ๆ แต่ฉันคิดว่านี่วัดพื้นที่วงกลมสีแดงอย่างแท้จริงแล้วหารด้วยรัศมีสองครั้งแก้หาπ = A / (r * r)
ไม่ใช่ชาร์ลส์ที่

พื้นที่นั้นค่อนข้างชัดเจนเมื่อตัวชี้เข้าสู่วงกลมสีแดงมันจะนับจำนวนโคเดอร์ในพื้นที่สีแดงและผลักมันไปยังสแต็กเมื่อออกจาก (ตั้งแต่จุดทางออกคือสีแดงเข้มดังนั้นจึงไม่มีการเปลี่ยนแปลงสี ) เป็นส่วน "หารด้วยรัศมีกำลังสอง" ที่ฉันมีปัญหาในการทำความเข้าใจ
plannapus

1
@plannapus รัศมีคือ "รหัสตายยาก" ในเส้นสีแดงเข้มที่ทอดยาวจากมุมบนซ้ายไปจนถึงกึ่งกลางลงไปทางซ้าย (มองเห็นได้ยากในภาพ) Piet ยากที่จะติดตาม แต่ส่วนสำคัญคือบล็อกของสีมีค่าเท่ากับพื้นที่ของพวกเขา (เส้นที่ขอบด้านซ้ายมีพิกเซลr , วงกลมมีพิกเซลพื้นที่ ) และสิ่งที่อยู่ในระหว่างนั้นเป็นเพียงการดำเนินการสแต็กและคณิตศาสตร์ โปรแกรมเริ่มต้นที่มุมบนซ้าย ข้อความที่ด้านบนขวานั้นเป็นความคิดเห็น
Jason C

2
@ JasonC ah แน่นอน! วงกลมสัมผัสทั้งด้านบนและด้านล่างดังนั้นเส้นสีแดงเข้มที่ลงมาจากด้านบนถึงตรงกลางจำเป็นต้องมีรัศมี! ฉลาด!
plannapus

18

ในทางเทคนิคแล้วฉันกำลังคำนวณ 9

0+3.14159

เทคนิคฉันยังคงคำนวณ 10

PI-acos(1)

ฉันกำลังคำนวณอย่างหนัก 8

acos(-1)

ฉันโดยบังเอิญ PI 12

"3.14"+"159"

และในทางเทคนิคแล้วคำตอบนี้ก็เหมือนกัน


31
ดังนั้นชื่อหัวข้อใหญ่มากเจ็บปวดมากสำหรับตาของฉันว้าว
Pierre Arlaud

1
pluzz wan สำหรับ lulz มาก, ขอบคุณ
Jonathan Van Matre

เฮ้ที่รักต้องการที่จะขยายซีรี่ส์ของฉันเทย์เลอร์?
Jason C


@SimonT คุณไม่ได้ตอบคำถามของฉันเกี่ยวกับซีรี่ส์ Taylor แต่ในขณะที่คุณกำลังคิดเกี่ยวกับมันดูความคิดเห็นของฉันในคำถามและคำตอบอื่น ๆ ที่นี่ : P
Jason C

14

APL - 6

2ׯ1○1

3.141592654เอาท์พุท มันคำนวณ arcsine ของ 1 เป็นสองเท่า

วิธีแก้ปัญหา 13-char จะเป็น:

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

ผลลัพธ์นี้3.141591654สำหรับฉันซึ่งเหมาะกับความแม่นยำที่ร้องขอ
มันใช้+ 4/1 - 4/3 + 4/5 - 4/7 ...ชุดง่ายในการคำนวณว่า


1
ว้าวนั่นคือการลู่เข้าที่ช้า!

ความคิดแรกของฉันคือ“ ทำไมไม่¯2○¯1” (เช่น acos -1) แต่นั่นให้การประมาณที่ซับซ้อนใน repl.it ( 3.1415926425236J¯1.1066193467303274e¯8) มีความคิดอะไรไหม การใช้งานทั้งหมดทำเช่นนั้นหรือไม่?
James Wood

+1 สำหรับโซลูชันที่สองของคุณ 2 * asin(1)เป็นบิตของการโกงแม้ว่า
Jason C

@JamesWood ผมไม่ทราบว่า APL แต่ถ้าผมต้องเดาผมว่ามันพยายามที่จะทำsqrt(1-theta^2)(ซึ่งปรากฏขึ้นในจำนวนมากของตัวตนหนุนก) 1-theta^2ในบางจุดและสูญเสียบางส่วนอยู่ที่ไหนสักแห่งแม่นยำสิ้นสุดกับติดลบเล็กน้อย
Jason C

1
acos -0.75สิ่งที่แปลกก็คือว่ายังคงมีส่วนจินตภาพเล็ก ๆ มันไม่มีทางที่มันจะคำนวณ1 - 0.75 ^ 2ได้ว่าเป็นลบ
James Wood

14

J - 5 ไบต์

|^._1

|log(-1)|ซึ่งหมายความว่า


การใช้เอกลักษณ์ของออยเลอร์อย่างชาญฉลาด
โม่

1
เด็ดอีกคำตอบเกี่ยวกับพีชคณิต เกี่ยวกับการเป็นที่ฉลาดเป็นหรือln(e^(42*pi))/42 pi*113/113
Jason C

ทำงานใน TI-BASIC
Timtech

1
(ที่ไม่เกี่ยวข้องกันโดยสิ้นเชิงฉันหวังว่าเราสามารถใช้น้ำยางใน codegolf.)
เจสันซี

1
(คำตอบสำหรับคำถามที่ไม่เกี่ยวข้องทั้งหมดฉันได้รับจาก Google charts เช่นที่นี่ ) ในหัวข้อนี้เป็นคำตอบที่เรียงลำดับและควรได้รับการยอมรับ
primo

14

Google Calculator, 48

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

ใช้แท่งของเนยทำการคำนวณขั้นสูงทำ pi จากมัน ฉันคิดว่าเนื่องจากทุกคนทำคำตอบทางคณิตศาสตร์อย่างง่ายฉันจะเพิ่มคำที่ไม่ซ้ำใครออกไปเล็กน้อย

ตัวอย่าง


3
stick of butterคือน่ารักและตลก แต่นี้เป็นหลักอีกpi*x/x+y-yตัวตนพีชคณิต
Jason C

10
มีหลายวิธีที่ดีกว่าในการทำ pi โดยใช้แท่งเนย
ไม่ใช่ว่า Charles

คุณเคยลองทำเนยด้วยแท่งปี่หรือไม่?
mbomb007

12

อ็อกเทฟ 31

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

คำนวณพื้นที่ของหนึ่งในสี่ของวงกลมด้วยรัศมี 2 ผ่านการรวมตัวเลข

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

1
ดี! +1 เมื่อคะแนนของฉันเพิ่มขึ้น
Jason C


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 shell:

>>> print s
3.14159265359

จัดการเพื่อหลีกเลี่ยงการนำเข้าใด ๆ สามารถสลับได้อย่างง่ายดายเพื่อใช้ไลบรารีทศนิยมความแม่นยำโดยพลการ เพียงแทนที่3.ด้วยDecimal('3')ตั้งค่าความแม่นยำก่อนและหลังจากนั้นรวมกันแล้วบวกผลลัพธ์เพื่อแปลงความแม่นยำ

และแตกต่างมากทั้งคำตอบที่นี่จริงคำนวณ πแทนที่จะอาศัยในตัวค่าคงที่หรือ fakery คณิตศาสตร์เช่นmath.acos(-1), math.radians(180)ฯลฯ


9

ภาษาแอสเซมบลี x86 (5 ตัวอักษร)

fldpi

ไม่ว่าสิ่งนี้จะโหลดค่าคงที่จาก ROM หรือคำนวณคำตอบจริงหรือไม่นั้นขึ้นอยู่กับโปรเซสเซอร์ (แต่อย่างน้อยก็มีบางอย่างที่จริงการคำนวณไม่ใช่แค่โหลดจำนวนจาก ROM) เพื่อให้สิ่งต่าง ๆ ได้รับการระบุว่ามีการใช้ 40 รอบนาฬิกาใน 387 ซึ่งค่อนข้างมากกว่าที่จะสมเหตุสมผลถ้ามันเพิ่งโหลดค่าจาก ROM

หากคุณต้องการให้แน่ใจว่าการคำนวณคุณสามารถทำสิ่งต่อไปนี้:

fld1
fld1
fpatan
fimul f

f dd 4

[สำหรับ 27 ตัว]


1
คุณช่วยอธิบายได้มั้ย
Nicolas Barbulesco

และในบางโปรเซสเซอร์การคำนวณจะfldpiทำอย่างไร?
Nicolas Barbulesco

1
ฉันไม่คิดว่าการใช้คำสั่งที่โหลด pi (หรือแม้แต่คำนวณตามการใช้งานของบุคคลอื่นหรือการใช้งานฟังก์ชั่นตรีโกณมิติใด ๆ ที่มีอยู่) นับเป็นจิตวิญญาณของ "การคำนวณ" ทุกอย่าง (ปัจจัย "omg assembler") ไม่เปลี่ยนเลย) บางทีพอร์ตนี้กับการติดตั้งแอสเซมเบลอร์ที่สั้นที่สุดเท่าที่จะเป็นไปได้และอาจเรียกได้ว่า "การคำนวณ"
Jason C

2
@ JasonC: ฟังดูเป็นความรู้สึกที่ไม่มีกฎเกณฑ์ใด ๆ เลยสำหรับฉันโดยที่ฉันไม่รู้สึกว่าการตัดสินใจของฉันจะทำให้ผู้คนต้องเพิ่มการลบการคูณและการหารด้วยตัวเองหากพวกเขาใช้มัน
Jerry Coffin

3
@JerryCoffin แทนที่จะเถียง technicalities พอจะพูดได้ว่าไม่ว่าจะasin(-1)มิได้fldpiเป็นที่น่าสนใจโดยเฉพาะอย่างยิ่งหรือความคิดสร้างสรรค์ ไม่มีจุดประสงค์มากนักในการแข่งขันเพื่อดูว่าภาษาที่โปรดปรานมีชื่อสั้นที่สุดสำหรับฟังก์ชั่นตรีโกณมิติที่กำหนดไว้ล่วงหน้าและค่าคงที่ของ pi
Jason C

8

bc -l, 37 ไบต์

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

ฉันไม่เห็นคำตอบอื่น ๆ ที่ใช้ผลิตภัณฑ์วอลลิสดังนั้นเนื่องจากชื่อของมันตั้งตามชื่อของฉัน ( อาจารย์วิชาประวัติศาสตร์คณิตศาสตร์ของฉันได้รับผลตอบรับมากมาย) ฉันไม่สามารถต้านทานได้

เปลี่ยนเป็นอัลกอริธึมที่ดีพอสมควรจากมุมมองของการเล่นกอล์ฟ แต่อัตราการบรรจบกันของมันนั้นแย่มาก - ใกล้ถึง 1 ล้านครั้งเพื่อให้ได้ทศนิยม 5 ตำแหน่ง:

$ 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 ซ้ำซึ่งให้ทศนิยม 10 ตำแหน่ง

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

สูตรซ้ำตาม Newton-Raphson คือ:

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 ตอนนี้มันก็เป็นมากกว่า!
Jason C

@JasonC ความคิดเห็นของคุณเกี่ยวกับการประยุกต์ใช้ Newton-Raphson ในการแก้ไขบาป (x) = 0 (ดูการแก้ไข) คืออะไร?
บาดเจ็บทางระบบดิจิตอล

6

หลาม - 47 45

pi ถูกคำนวณโดยไม่มีฟังก์ชันตรีโกณมิติหรือค่าคงที่

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

ผลลัพธ์:

>>> a
3.1415907719167966

ควรจะสามารถบันทึกไบต์โดยการปล่อยศูนย์หลังจุดทศนิยมสำหรับการตีความลอยบังคับ :) คะแนนโบนัสสำหรับช่วงสั้น ๆ แต่ฉันชอบของฉันสำหรับความแม่นยำโดยพลการและการใช้หน่วยความจำลดลง (แก้ไขเพื่อขีดความคิดของวงเล็บ; ฉันเห็นสิ่งที่เกิดขึ้นที่นั่นและการทดสอบแบบแยกตัวของฉันไม่ได้เป็นปัญหา)
รวบรวม

เอ่อ…ไม่ หลังจากที่คุณแก้ไขสิ่งนี้จะไม่ให้ผลลัพธ์ที่ถูกต้องอีกต่อไป (265723 ≭π) คุณยังคงต้องการระยะเวลาไม่ใช่ศูนย์ต่อท้าย
amcgregor

@amcgregor ใช้ python 3 หรือไม่
qwr

ฉันทำแม้ว่าฉันจะพัฒนาภายใต้ 2.7 เป็นหลักและทำให้โค้ดของฉันทำงานทั้งคู่ อย่างไรก็ตามในสต็อกการติดตั้ง Mac 10.9 python3 รหัสของคุณทำให้เกิดการแบ่งส่วน
amcgregor

@ 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(อันที่จริงมันแค่คำนวณหนึ่งควอดเรนต์) ด้วยจำนวนr10,000 จึงมีความแม่นยำถึงทศนิยม 5 ตำแหน่ง (3.1415904800) พารามิเตอร์ของฟังก์ชันถูกละเว้นฉันเพิ่งประกาศไว้ที่นั่นเพื่อประหยัดพื้นที่


6

Javascript, 43 36

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

xกลายเป็นzeta(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, Riemann zeta (58 41 ถ่าน)

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

หรือสำรองอักขระสองตัว แต่ใช้ scipy

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

แก้ไข : บันทึก 16 (!) ตัวละครด้วยamcgregor


1
สามารถหลีกเลี่ยงmathการนำเข้าและการsqrtโทรโดยใช้การหมุนแทนการยกกำลังแทน:(6*sum(n**-2 for n in range(1,9**9)))**0.5
amcgregor

5

Javascript: 99 ตัวอักษร

การใช้สูตรที่กำหนดโดย Simon Plouffe ในปี 1996 นี้ทำงานได้ด้วยความแม่นยำ 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)

ตัวแปรที่ยาวกว่านี้ (130 ตัวอักษร) มีความแม่นยำดีขึ้น 15 หลักหลังจุดทศนิยม:

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)

ฉันทำสิ่งนี้ตามสอง คำตอบสำหรับคำถามนี้


5

ทับทิม, 54 50 49

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

เวอร์ชั่นออนไลน์สำหรับการทดสอบ

รุ่นอื่นโดยไม่ต้องสร้างอาร์เรย์ (50 ตัวอักษร):

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

เวอร์ชั่นออนไลน์สำหรับการทดสอบ


เป็นเรื่องที่น่าสนใจที่จะเห็นความแตกต่างของภาษาที่โซลูชั่นขนาดกะทัดรัดสามารถให้ได้ ตัวอย่างเช่นการแปล Python ของด้านบนคือ 105 ตัวอักษร (หลังจากใช้เทคนิคการบีบอัดรหัสเล็กน้อย): a=__import__;reduce(a('operator').__add__,a('itertools').imap(lambda e:(-1.0)**e/(2*e+1)*4,xrange(9**6)))- บันทึกการใช้ xrange / imap; ใน Python 3 คุณสามารถหลีกเลี่ยงสิ่งนี้ได้ โดยพื้นฐานแล้วฉันไม่ต้องการให้แรมทั้งหมดของคุณใช้การสร้างรายการที่มีรายการมากมาย
amcgregor

1
คุณพูดถูก มันมักจะสะดวกในการใช้ฟังก์ชั่น Array และ Enumerable (โดยเฉพาะอย่างยิ่งรูบี้) แม้ว่ามันอาจจะไม่ใช่ความคิดที่ดีที่สุดในแง่ของประสิทธิภาพและความเร็ว ... จริง ๆ แล้วลองคิดดูว่ามันควรจะคำนวณด้วย วิธีการ Range.each แทนการสร้างแผนที่
David Herrmann

ใช่เป็นไปได้ - มีเพียงตัวละครตัวหนึ่งมากกว่า ...
David Herrmann

คำตอบแรกของคุณไม่แม่นยำเท่ากับคำตอบที่สองของคุณ
Josh

กรุณาอธิบายเพิ่มเติมหน่อยได้ไหม? อัลกอริทึมเดียวกันผลลัพธ์เดียวกันสำหรับฉัน
David Herrmann

5

TI CAS, 35

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

1
ฉันมองย้อนกลับไปที่สิ่งนี้และฉันลืมวิธีการทำงานอย่างสมบูรณ์: P
TheDoctor

5

Perl - 35 ไบต์

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

สร้างความแม่นยำจุดลอยตัวแบบเต็ม รากศัพท์ของสูตรที่ใช้สามารถมองเห็นได้ในที่อื่น ๆ

ตัวอย่างการใช้งาน:

$ perl pi.pl
3.14159265358979

รุ่นที่มีความแม่นยำโดยพลการ

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

ขยายได้ตามต้องการ -329..-1ควรปรับความยาวของการวนซ้ำ (เช่น) เป็นล็อกประมาณ2 (10)3.322 คูณจำนวนหลัก

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211707

หรือใช้bigintแทน:

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

สิ่งนี้จะทำงานได้เร็วขึ้นอย่างเห็นได้ชัด แต่ไม่มีจุดทศนิยม

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

ขาออก:

3.14159265

ไม่มีคณิตศาสตร์ที่เกี่ยวข้อง เพียงค้นหาเวอร์ชันปัจจุบันของ TeXและทำการแยกวิเคราะห์ดั้งเดิมของ HTML ที่เป็นผลลัพธ์ ในที่สุดก็จะกลายเป็นπตามวิกิพีเดีย


ฉันมา 5 ปีแล้ว แต่นี่เป็นช่องโหว่มาตรฐานที่สร้างขึ้น 4 วันก่อนคำตอบนี้
Benjamin Urquhart

5

Python 3 Monte Carlo (103 ถ่าน)

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, 34

ถือว่าตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้นทั้งหมดเป็น 0 ซึ่งเป็นค่าเริ่มต้นในบางเวอร์ชันของ Game Maker

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

ผลลัพธ์:

3.14159169865946

ดีมาก. นอกจากนี้ใน C float k(){double x=0,i=0;for(;i++<999999;)x+=6/i/i;return sqrt(x);}จะสั้นกว่าอันนี้
izabera

ยิ่งสั้นลงด้วย1e8แทนที่จะเป็น 999999
izabera

คุณสามารถใช้for(i=1;i<1e8;)x+=6/i/i++;sqrt(x)บันทึกไบต์ (หรืออีกวิธีหนึ่งfor(i=1;i++<1e8;)) ได้หรือไม่?
mbomb007

@ mbomb007 น่าเสียดายที่ GML ต้องการพารามิเตอร์ทั้ง 3 ตัว
Timtech

4

ชวา - 83 55

เวอร์ชั่นที่สั้นลงต้องขอบคุณ Navin

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

เวอร์ชั่นเก่า:

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

สิ่งนี้ไม่ได้ทำการคำนวณใด ๆ
Hosch250

ฉันไม่เข้าใจ downvote แม้ว่า - ฉันตอบด้วย "Math.toRadians (180)" นอกจากนี้ยังเป็นที่สงสัยซึ่งคำนวณ pi: คอมไพเลอร์หรือโปรแกรม แต่นั่นไม่ใช่ส่วนหนึ่งของคำถาม
blabla999

2
@ user2509848 มันแน่นอนที่สุดไม่: มันคูณโดย180 pi/180
AJMansfield

คุณหมายถึงมันคูณ pi ด้วย 1? มันเป็นสิ่งเดียวกัน ฉันไม่ได้ลงคะแนน แต่ฉันไม่คิดว่าจะนับ
Hosch250

1
สามารถสั้นกว่า: codegolf.stackexchange.com/a/22057/14610
Navin


3

ทับทิม, 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

ใช้สูตรบางอย่างที่ฉันไม่เข้าใจและคัดลอกลงไป : P

เอาท์พุท: 3.1415926535897913


3

ทับทิม, 12

p 1.570796*2

ฉันกำลังใช้เทคนิค "คำนวณ" piการประมาณของ pi


ไม่คุณไม่ได้คำนวณทางเทคนิค คุณกำลังเทคนิคการคำนวณ 3.141592 ที่เกิดขึ้นจะใกล้เคียงกับปี่ acos(-1)แต่ไม่เคยจะมาบรรจบกันตรง
wchargin

@Wchar Ok แก้ไข
Doorknob

3
ฉันไม่คิดว่าการเข้ารหัสยาก pi / 2 แล้วคูณด้วย 2 นับจริง ๆ จุดคือการคำนวณ pi ไม่ทำให้งงตัวอักษรที่เป็นตัวเลข
Jason C

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.