Pi розрахунковий код Golf [закрито]


17

Змагання

Ви повинні обчислити пі в найкоротшій довжині. Будь-яку мову можна приєднати, і ви можете використовувати будь-яку формулу для обчислення пі. Він повинен бути в змозі обчислити pi принаймні до 5 знаків після коми. Найкоротше, вимірюється символами. Змагання тривають 48 годин. Почніть.


Примітка . У цьому аналогічному запитанні зазначено, що PI потрібно обчислювати, використовуючи ряд 4 * (1 - 1/3 + 1/5 - 1/7 +…). Це питання не має цього обмеження, і насправді багато відповідей (включаючи найбільш ймовірні перемоги) були б недійсними в тому іншому питанні. Отже, це не дублікат.


5
@hvd Чому, на вашу думку, його слід дискваліфікувати? Він відповідає специфікаціям ...
Доктор belisarius,

5
@hvd acos (-1). Я виграв!
Рівень р. Св.

4
Це виглядає дивно, непослідовно. Обчислення π має бути діленням кола на його діаметр або іншою операцією, що дає π. Якщо ми погоджуємось робити 355/113 - що не має нічого спільного з π, крім удачі - як @ace, то логічно, ми повинні прийняти виконання 3.14159 .
Ніколя Барбулеско,

7
Я не розумію, чому людям подобається це питання. Це одне з найбільш чітко визначених і нецікавих питань, які я тут бачив. Єдина різниця між цим і привітним світом полягає в тому, що це має щось спільне з Пі.
Cruncher

8
Щоб зробити це питання цікавим, йому потрібна функція підрахунку балів, яка нагороджує цифри pi на байт коду.
Бен Джексон

Відповіді:


56

Python3, 7

Працює в інтерактивній оболонці

355/113

Вихід: 3.1415929203539825 виправте 6 знаків після коми

І, нарешті, у мене є рішення, яке б'є APL!

О, і якщо вам цікаво, це співвідношення називається 密 率 (буквально "точне співвідношення"), і його пропонує китайський математик Зу Чонджі (429-500 рр. Н.е.). Зв'язану статтю з вікіпедії можна знайти тут . Зу також дав співвідношення 22/7 як "грубе співвідношення", і він, як відомо, є першим математиком, який запропонував, що 3.1415926 <= pi <= 3.1415927


12
mhmh - це насправді поліглот відповідь. Працює і в Smalltalk!
blabla999

7
Богохульство! Це ледь розрахунок!
mniip

3
ну, це поділ, і його точність задовольняє вимогу ... (і навіть Біблія менш точна; ти б не
позначав

29
Неприємний момент, коли я написав це як серйозну відповідь, але всі трактують це як жарт ...
user12205

20
Найвищий проголосували відповідь: 355/113. Найнижчий голосував відповідь: 3+.14159. Я не бачу великої різниці, насправді.
примо

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

Дякуємо хмарному стопу та замутів за пропозиції!

Вибірка зразка:

$ 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 байт, серії Лейбніца:

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

12
Іншими словами, це atan(0) + pi. Я не думаю, що використання тригонометричних функцій і пі-пі слід вважати "розрахунком".
Джейсон C

@JasonC Arg(тобто аргумент складного числа) не є тригонометричною функцією, незважаючи на значення, схожі на значення арктангенту
mniip

1
@mniip Так, так. Це просто синонім atan (ну, atan2) на реальній і уявній частинах. Як ви можете бачити, це точно за визначенням дорівнює atan(0) + pi.
Джейсон C

25

Perl, 42 байти

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

Він обчислює π, використовуючи формулу Лейбніца :

Leipniz formula

999999 використовується як найбільший n, щоб отримати точність п'яти знаків після коми.

Результат: 3.14159165358977


Це круто! Це надихнуло мене написати один на Java 8.
Девід Конрад

19

Піт, багато коделів

Не моя відповідь, але це найкраще рішення цієї проблеми:

Pi approximation in Piet

Я розумію, що він додає пікселі по колу і ділиться за радіусом, а потім ще раз. Тобто:

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

Кращим підходом на мою думку є програма, яка генерує це зображення у довільному розмірі, а потім запускає його через інтерпретатора Piet.

Джерело: http://www.dangermouse.net/esoteric/piet/samples.html


Чи можете ви пояснити, що це насправді робить? (Я знаю загальну ідею Piet, але пояснення того, як працює ця конкретна програма, буде приємним доповненням до вашої відповіді).
планнапус

Я не знаю Піта, але я думаю, що це буквально вимірює площу червоного кола, а потім ділиться по радіусу вдвічі, вирішуючи для π = A / (r * r)
Не те, щоб Чарльз

Ну область досить чітка, тому що, коли вказівник входить до червоного кола, він підраховує кількість коделів у червоній області та підштовхує його до стеку при виході (оскільки точка виходу темно-червона, отже, не змінюється відтінок, але на крок темніше ), саме "розділення на радіус у квадраті" частина, що у мене виникли проблеми з розумінням.
планнапус

1
@plannapus Радіус "кодується" темно-червоною лінією, що проходить від лівого верхнього кута до половини лівого краю (важко це побачити на зображенні). Пієт важко дотримуватися, але суть кольорів блоків має значення, рівне їх площі (рядок у лівому краї має r пікселів, коло має пікселі площі ), а між ними є лише купа стека та арифметичні операції. Програми стартують у верхньому лівому куті. Текст у верхньому правому куті є по суті коментарем.
Джейсон C

2
@JasonC ах звичайно! Коло торкається і верхньої, і нижньої сторони, тому темно-червона лінія, що спускається з верхньої сторони до точної середини, потрібна радіус! Розумний!
планнапус

18

ТЕХНІЧНО Я РОЗРАХУЮТЬСЯ, 9

0+3.14159

ТЕХНІЧНО Я РОЗРАХУЮ, 10

PI-acos(1)

Я РОЗРАХУНУЮТЬ ТАК ТВЕРДО, 8

acos(-1)

Я ДІЙЧНО ПІ, 12

"3.14"+"159"

А технічно ця відповідь смердить.


31
Тож заголовок, набагато більший заголовок, дуже біль для моїх очей, вау.
П'єр Арло

1
pluzz wan for much lulz, thankz
Джонатан Ван Матре

Ей, дитино, хочеш розширити свою серію Тейлор?
Джейсон C


@SimonT Ви не відповіли на моє запитання про серію Тейлор. Але поки ви думаєте про це, дивіться мої коментарі до цього питання та більшість інших відповідей тут. : P
Джейсон C

14

APL - 6

2ׯ1○1

Виходи 3.141592654. Він обчислює вдвічі більше дуги 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). Будь-яка ідея чому? Чи всі це роблять?
Джеймс Вуд

+1 для вашого другого рішення. 2 * asin(1)хоч трохи обман.
Джейсон C

@JamesWood Я не знаю APL, але якби мені довелося здогадатися, я б сказав, що він намагався зробити якийсь момент sqrt(1-theta^2)(який вискакує у багатьох трійкових ідентичностях) в якийсь момент і десь втратив точність, закінчуючи трохи негативним 1-theta^2.
Джейсон C

1
Що дивно, це те, що є ще крихітна уявна частина acos -0.75. Немає можливості обчислити 1 - 0.75 ^ 2його як негативне.
Джеймс Вуд

14

J - 5 байт

|^._1

Це означає |log(-1)|.


Розумне використання ідентичності Ейлера.
прим

1
Класна, ще одна відповідь алгебраїчної ідентичності. Настільки ж розумний, як ln(e^(42*pi))/42чи pi*113/113.
Джейсон C

Також працює в TI-BASIC
Timtech

1
(Цілком не пов’язані між собою, я б хотів, щоб ми могли використовувати LaTeX на codegolf.)
Джейсон C,

1
(Відповідаючи на абсолютно незв’язане запитання, я розглядаю google-графіки, наприклад, тут .) Щодо теми, це найстрашніша відповідь, і тому я повинен був прийняти.
прим

14

Google Калькулятор, 48

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

Бере паличку вершкового масла, робить розширені розрахунки, робить пі з неї. Я подумав, оскільки всі інші займаються простими математичними відповідями, я б додав трохи більш унікальний.

Приклад


3
Це stick of butterмило і смішно, але це, по суті, ще одна pi*x/x+y-yалгебраїчна ідентичність.
Джейсон C

10
Є так багато кращих способів зробити пі, використовуючи паличку вершкового масла
Не те, щоб Чарльз

Ви пробували робити масло з паличкою пі?
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, коли мої голоси поповнюються.
Джейсон C


10

Пітона, 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

Вдається уникати будь-якого імпорту. Легко поміняти місцями, щоб використовувати бібліотеку довільної точності Десяткової; просто замінити 3.з Decimal('3'), встановіть точність до і після, то унарний плюс результат для перетворення точності.

І в відміну від всього багато відповідей тут, на самому ділі обчислює π замість того , щоб покладатися на вбудовані константи або математики, тобто підробки math.acos(-1), math.radians(180)і т.д.


9

x86 мова складання (5 символів)

fldpi

Чи завантажує це константа з ПЗУ чи насправді обчислює відповідь, залежно від процесора (але, принаймні, на деяких, він насправді робить розрахунок, а не просто завантажує число з ПЗУ). Щоб переглянути речі в перспективі, це перераховано як 40 циклів годин на 387, що, швидше за все, має сенс, якби він просто завантажував значення з ROM.

Якщо ви дійсно хочете забезпечити розрахунок, ви можете зробити щось на кшталт:

fld1
fld1
fpatan
fimul f

f dd 4

[для 27 символів]


1
Можете пояснити, будь ласка?
Ніколя Барбулеско,

And, on some processors, what calculcation would fldpi do ?
Nicolas Barbulesco

1
I don't think using a command that loads pi (or even computes it based on somebody else's asin implementation or any existing trig function implementations at all) really counts in the spirit of "calculating" anything (the "omg assembler" factor doesn't really change that). Perhaps port this to the shortest assembler implementation possible, and it can be called a "calculation".
Jason C

2
@JasonC: Sounds like an entirely arbitrary notion to me, with no more real sense than my deciding that people had to implement addition, subtraction, multiplication and division on their own if they're doing to use them.
Jerry Coffin

3
@JerryCoffin Instead of arguing technicalities, suffice it to say that neither asin(-1) nor fldpi are particularly interesting or creative. There's not much purpose in competing to see whose favorite language has the shortest name for predefined trig functions and pi constants.
Jason C

8

bc -l, 37 bytes

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 байт

Крім того, ми можемо використовувати Ньютона-Рафсона для вирішення sin(x)=0із початковим наближенням 3. Оскільки це сходиться за такою кількістю ітерацій, ми просто жорстко кодуємо 2 ітерації, що дає 10 десяткових знаків:

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 now that's more like it!
Jason C

@JasonC What is your opinion of application of Newton-Raphson to solve sin(x)=0 (see edit)?
Digital Trauma

6

python - 47 45

pi is actually being calculated without trig functions or constants.

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

result:

>>> a
3.1415907719167966

Should be able to save a byte by dropping the zero after the decimal place for forced float interpretation. :) Bonus points for brevity, but I like mine for arbitrary accuracy and lower memory utilization. (Edited to scratch the parenthesis idea; I see what's going on there and my isolated test didn't catch the issue.)
amcgregor

Uh… no. After your modification this no longer gives valid output. (265723 ≭ π) You still need the period, just not the trailing zero.
amcgregor

@amcgregor use python 3?
qwr

I do, though I primarily develop under 2.7 and make my code work in both. However on the stock Mac 10.9 python3 installation your code causes a segmentation fault.
amcgregor

@amcgregor I just tested it, it works for me (python 3.3.4)
qwr

6

C, 99

Directly computes area / r^2 of a circle.

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

This function will calculate pi by counting the number of pixels in a circle of radius r then dividing by r*r (actually it just calculates one quadrant). With r as 10000, it is accurate to 5 decimal places (3.1415904800). The parameters to the function are ignored, I just declared them there to save space.


6

Javascript, 43 36

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

x becomes zeta(2)=pi^2/6 so sqrt(6*x)=pi. (47 characters)

After using the distributive property and deleting the curly brackets from the for loop you get:

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

(43 characters)

It returns:

3.14159169865946

Edit:

I found an even shorter way using the Wallis product:

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

(36 characters)

It returns:

3.141591082792245

6

Python, Riemann zeta (58 41 char)

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

Or spare two characters, but use scipy

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

Edit: Saved 16 (!) characters thanks to amcgregor


1
Can potentially avoid the math import and sqrt call by pivoting to exponentiation instead: (6*sum(n**-2 for n in range(1,9**9)))**0.5
amcgregor

5

Javascript: 99 characters

Using the formula given by Simon Plouffe in 1996, this works with 6 digits of precision after the decimal point:

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

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



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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.