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
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ěď
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ěňte1
na0
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}
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 .
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));}}
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
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.