Vypočítejte 500 číslic pí

Napište program pro výpočet prvních 500 číslic pí podle pravidel níže:

  • Musí mít délku menší než 500 znaků.
  • Nesmí obsahovat konstanty „pi“, „math.pi“ ani podobné konstanty pí, ani nemůže volat funkci knihovny pro výpočet pí.
  • Nesmí používat číslice „3“, „1“ a „4“ za sebou.
  • Musí se provést v rozumném čase (pod 1 minutu) na moderním počítači.

Vyhrává nejkratší program.

Komentáře

  • Kontrola správnosti číslic: eveandersson.com/pi/digits
  • Je povoleno tisknout více než 500 číslic se ztrátou přesnosti po prvních 500?
  • @Alexandru, I Předpokládám, že ano, ale byl bych raději, kdyby to bylo zkráceno.
  • Můžeme pomocí knihovny HTTP stáhnout “ číslice pí “ web? 😉
  • Přišel sem a doufal, že získá něco pěkného a výstižného pro generování libovolných délkových aproximací pí v pythonu … bohužel @Soulman ‚ s řešením pythonu je zřejmě naladěn na 500 číslic; výměna 500 za 1000 dává nesprávnou odpověď. Zajímalo by mě, jestli existuje dobrý způsob, jak formulovat alternativní výzvu, která by vytvořila pěknou krátkou funkci, která je obecně užitečná pro generování libovolného počtu číslic?

Odpovědět

Golfscript – 29 znaků

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

Analýzu zveřejním později

Komentáře

  • Můžete vysvětlit, jak to funguje?
  • “ Analýzu zveřejním později „. (čeká 3 roky) ….
  • “ Analýzu zveřejním později “ * čeká na další než 6 let *
  • “ Analýzu zveřejním později “ (čeká 8 let)
  • Stále čekám …

Odpověď

Mathematica (34 znaků): (bez „podvádění“ s trig)

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

K vysvětlení kouzla zde:
Integrate[function, lower, upper] vám dává oblast pod křivkou „funkce“ od „spodní“ do „horní“. V tomto případě je touto funkcí [1-x^2]^.5, což je vzorec, který popisuje horní polovinu kružnice s poloměrem 1. Protože kružnice má poloměr 1, neexistuje pro hodnoty x menší než -1 nebo vyšší než 1. Proto nacházíme plochu poloviny kruhu. Když vynásobíme 2, dostaneme oblast uvnitř kruhu o poloměru 1, který se rovná pí.

Komentáře

  • Možná by měl do vaší odpovědi vložit vysvětlení, proč to funguje (pro ně nematematické lidi).
  • skvělý nápad. V současné době se o to postarám. ‚ Poskytnu základní vysvětlení použité matematiky.
  • Možná byste to mohli zkrátit: změnit sqrt[1-x^2] na (1-x^2)^.5)
  • a mohu odstranit * po 2. Mathematica je báječná.

Odpověď

Python (83 znaků)

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 

odpověď

Husk , 28 25 24 bajtů

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

Zkuste to online!

Vypočítá hodnotu pí jako racionální číslo pomocí prvních 5000 výrazů nekonečné řady 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) a poté extrahuje prvních 500 číslic.

Kód pro výpočet hodnoty pí ze zadaného počtu výrazů je pouze 13 bajtů (Σ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 

Bohužel pak musíme promarnit 3 bajty se zadáním počtu podmínek, které se mají použít:

□70 # 70^2 = 4900 

A pak dalších 8 bajtů převádějící racionální číslo (vyjádřené jako zlomek) na jeho číslice v desítkové formě:

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

Odpověď

PARI / GP, 14

\p500 acos(-1) 

Trignu se můžete vyhnout nahrazením druhý řádek s

gamma(.5)^2 

nebo

(6*zeta(2))^.5 

nebo

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

nebo

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

nebo

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

Odpověď

Python3 136

Používá Madhavu „s vzorec.

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

Používá toto vzorec.

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

odpověď

Mathematica (17 bajtů)

N[ArcCos[-1],500] 

Doklad o platnosti .

Odpověď

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Používá tento algoritmus: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) nalezený v komentářích odpovědi Golfscript.

Komentáře

  • To si ‚ nezaslouží downvote …
  • Tato odpověď je nesprávná, generuje 34247779. .. což podle mých znalostí není pi.
  • @orlp Operace r byla nedávno změněna způsobem, který tuto odpověď zlomil. Změňte 1 na 0 a bude fungovat v aktuálním Pythu.

Odpověď

JavaScript, 60 bajtů

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

Vyzkoušejte to online!

Komentáře

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

Odpověď

bc -l (22 = 5 příkazový řádek + 17 program)

scale=500 4*a(1) 

Komentáře

  • Pravidla říkají “ ani nesmí volat funkci knihovny pro výpočet pí. “
  • @Peter Problém podle mě spočívá v tom, že “ funkce knihovny “ není vždy dobře definovaný pojem a zhoršuje se to jen tehdy, když řeknete “ k výpočtu Pi „, jak jej můžete použít k výpočtu mezivýsledků, například Sqrt () v Alexandru

    s odpověď.

  • Myslím, že je to podvádění, protože atan počítá 1/4 pí, ale přesto je to zajímavé řešení.
  • @Thomas O : pokud se jedná o podvádění, kde ‚ s limit?
  • trig funkce by měly být zakázány kvůli odpovědím jako je tato. Myšlenka je vypočítat pí pomocí algoritmu, nikoli vestavěné funkce. sqrt je trochu jiný, protože ‚ není spouštěcí funkcí.

Odpovědět

Mathematica – 50

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

odpověď

Java 10 , 208 207 206 193 bajtů

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

-14 bajtů díky @ceilingcat .

Vyzkoušejte online .

Nebo jako celý program (245 bajtů):

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

Vyzkoušejte to online.

Odpověď

Axiom, 80 bajtů

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

pro informaci https://tuts4you.com/download.php?view.452 ; bylo by to přizpůsobení 6 * arctg (1 / sqrt (3)) =% pi a pro arctg by se použilo sériové rozšíření

 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 

Odpověď

05AB1E , 20 bajtů

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

Port mé odpovědi Java (s 503 nahrazeno 1000 – vše \ $ \ geq503 \ $ je v pořádku pro výstup prvního S tímto přístupem přesně 500 číslic).

Vyzkoušejte to online nebo ověřte to “ s rovná prvním 500 číslicím PI pomocí integrovaného žs .

Vysvětlení:

 ₄° # 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)  

Odpovědět

Fortran, 154 bajtů

Mangled the rosetta code . Uloženo spousta bajtů pomocí implicitních celých čísel i j k l m n, print namísto write a míchání věcí kolem

Vyzkoušejte online …

 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  

odpověď

APL (NARS2000), 20 bajtů

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

Toto jsem nemohl otestovat, ale zde je verze v Dyalog APL. Jediný rozdíl mezi nimi je přípona “ x „, která se používá pro racionální čísla v NARS2000, ale není k dispozici v Dyalogu (nebo další varianty dostupné online, pokud vím).

Vychází z vzorce pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) v komentářích pod přijatou odpovědí Golfscript.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *