Schreiben Sie ein Programm, um die ersten 500 Stellen von pi zu berechnen, und erfüllen Sie dabei die folgenden Regeln:
- Es muss weniger als 500 Zeichen lang sein.
- Es darf weder „pi“, „math.pi“ oder ähnliche pi-Konstanten enthalten, noch darf es eine Bibliotheksfunktion zur Berechnung von pi aufrufen.
li> Die Ziffern „3“, „1“ und „4“ dürfen nicht nacheinander verwendet werden.
/ ul>
Das kürzeste Programm gewinnt.
Kommentare
- So überprüfen Sie, ob Ihre Ziffern korrekt sind: eveandersson.com/pi/digits
- Dürfen wir nach den ersten 500 mehr als 500 Ziffern mit Genauigkeitsverlust drucken?
- @Alexandru, I. Nehmen wir an, aber ich würde es vorziehen, wenn es abgeschnitten wird.
- Können wir eine HTTP-Bibliothek verwenden, um “ Ziffern von pi “ Website? 😉
- Kam hierher in der Hoffnung, etwas Schönes und Prägnantes für die Erzeugung beliebiger Längenannäherungen von pi in Python zu erhalten … leider ist @Soulmans ‚ Python-Lösung anscheinend auf 500 Stellen eingestellt; Das Ersetzen von 500 durch 1000 führt zu einer falschen Antwort. Ich frage mich, ob es eine gute Möglichkeit gibt, eine alternative Herausforderung zu formulieren, die eine schöne kurze Funktion erzeugt, die im Allgemeinen zum Generieren einer beliebigen Anzahl von Ziffern nützlich ist.
Antwort
Golfscript – 29 Zeichen
6666,-2%{2+.2/@*\/9)499?2*+}*
Ich werde die Analyse später veröffentlichen
Kommentare
- Können Sie erklären, wie das funktioniert?
- “ Ich werde die Analyse später veröffentlichen „. (wartet 3 Jahre) ….
- “ Ich werde die Analyse später veröffentlichen. “ * wartet auf mehr als 6 Jahre *
- “ Ich werde die Analyse später veröffentlichen “ (wartet 8 Jahre)
- Ich warte immer noch …
Antwort
Mathematica (34 Zeichen): (ohne „Betrug“ mit trig)
N[2Integrate[[1-x^2]^.5,-1,1],500]
Um die Magie hier zu erklären:
Integrate[function, lower, upper]
gibt Ihnen den Bereich unter der Kurve „Funktion“ von „unten“ nach „oben“. In diesem Fall lautet diese Funktion [1-x^2]^.5
. Dies ist eine Formel, die die obere Hälfte eines Kreises mit Radius 1 beschreibt. Da der Kreis einen Radius von 1 hat, existiert er nicht für Werte von x kleiner als -1 oder höher als 1. Daher finden wir die Fläche eines halben Kreises. Wenn wir mit 2 multiplizieren, erhalten wir die Fläche innerhalb eines Kreises mit dem Radius 1, der pi entspricht.
Kommentare
- Vielleicht Sie sollte in Ihre Antwort eine Erklärung einfügen, warum dies funktioniert (für Nicht-Mathematiker).
- wunderbare Idee. Ich werde mich gleich darum kümmern. Ich ‚ werde eine grundlegende Erklärung der Mathematik geben.
- Vielleicht können Sie es verkürzen: Ändern Sie
sqrt[1-x^2]
in(1-x^2)^.5)
- und ich kann das * nach dem 2. Mathematica entfernen.
Antwort
Python (83 Zeichen)
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
Antwort
Schale , 28 25 24 Bytes
i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70
Berechnet den Wert von pi als rationale Zahl mit die ersten 5000 Terme der unendlichen Reihe 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
und extrahiert dann die ersten 500 Ziffern.
Der Code zum Berechnen des Werts von pi aus einer bestimmten Anzahl von Termen beträgt nur 13 Bytes (Σ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
Leider müssen wir dann 3 Bytes verschwenden, indem wir die Nummer angeben Anzahl der zu verwendenden Begriffe:
□70 # 70^2 = 4900
Und dann 8 weitere Bytes, die die rationale Zahl (ausgedrückt als Bruch) in Dezimalzahlen in ihre Ziffern umwandeln:
i*!500İ⁰ i # integer value of * # multiplying by !500 # 500th element of İ⁰ # series of powers of 10
Antwort
PARI / GP, 14
\p500 acos(-1)
Sie können Trigger durch Ersetzen vermeiden die zweite Zeile mit
gamma(.5)^2
oder
(6*zeta(2))^.5
oder
psi(3/4)-psi(1/4)
oder
4*intnum(x=0,1,(1-x^2)^.5)
oder
sumalt(k=2,(-1)^k/(2*k-3))*4
Antwort
Python3 136
Verwendet Madhava „s Formel.
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
Verwendet this Formel.
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])
Antwort
Antwort
Pyth , 21
u+/*GHhyHy^T500r^3T1Z
Verwendet diesen Algorithmus: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
in den Kommentaren der Golfscript-Antwort gefunden.
Kommentare
- Dies ‚ verdient keine Ablehnung …
- Diese Antwort ist falsch, sie generiert 34247779. .. was meines Wissens nicht pi ist.
- @orlp Die Operation
r
wurde kürzlich so geändert, dass diese Antwort gebrochen wurde. Ändern Sie die1
in eine0
, und sie funktioniert im aktuellen Pyth.
Antwort
JavaScript, 60 Byte
i=1n;p=x=3n*(10n**520n);while(x=x*i/(i*4n+4n)){i+=2n;p+=x/i}
Kommentare
- 62 Bytes:
for(i=1n,p=x=3n*(10n**520n);x>0;x=x*i/(i*4n+4n),p+=x/(i+=2n));
Antwort
bc -l (22 = 5 Befehlszeile + 17 Programm)
scale=500 4*a(1)
Kommentare
- Die Regeln sagen “ und dürfen auch keine Bibliotheksfunktion aufrufen pi berechnen. “
- @Peter Das Problem, denke ich, ist, dass “ Bibliotheksfunktion “ ist nicht immer ein genau definierter Begriff, und es wird nur schlimmer, wenn Sie “ sagen, um Pi „, wie Sie es verwenden können, um Zwischenergebnisse zu berechnen, zum Beispiel Sqrt () in Alexandru
s Antwort.
- Ich denke, das ist Betrug, weil atan 1/4 pi berechnet, aber es ist trotzdem eine interessante Lösung.
- @Thomas O. : Wenn dies ein Betrug ist, wo ‚ das Limit ist?
- Triggerfunktionen sollten aufgrund solcher Antworten verboten worden sein. Die Idee ist, pi mit einem Algorithmus zu berechnen, nicht mit einer eingebauten Funktion. sqrt ist etwas anders, da ‚ keine Triggerfunktion ist.
Antwort
Mathematica – 50
½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½]
Antwort
Java 10 , 208 207 206 193 Bytes
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 Bytes dank @ceilingcat .
Oder als vollständiges Programm (245 Byte):
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));}}
Antwort
Axiom, 80 Byte
digits(503);v:=1./sqrt(3);6*reduce(+,[(-1)^k*v^(2*k+1)/(2*k+1)for k in 0..2000])
als Referenz https://tuts4you.com/download.php?view.452 ; Dies wäre eine Annäherung an 6 * arctg (1 / sqrt (3)) =% pi und würde eine Serienerweiterung für arctg
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
05AB1E , 20 Bytes
₄°·D.ΓN>*N·3+÷}O+₄;£
Port von meiner Java-Antwort (mit der 503
ersetzt durch 1000
– alles, was \ $ \ geq503 \ $ ist, ist in Ordnung, um das erste auszugeben 500 Stellen genau mit diesem Ansatz).
Probieren Sie es online aus oder überprüfen Sie es “ s entspricht den ersten 500 Stellen von PI unter Verwendung der integrierten žs
.
Erläuterung:
₄° # 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)
Antwort
Fortran, 154 Bytes
Die Rosetta Code Lösung. Gespeicherte viele Bytes mit impliziten Ganzzahlen i j k l m n
, print
anstelle von write
und Mischen von Dingen um
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
Antwort
APL (NARS2000), 20 Bytes
{2+⍵×⍺÷1+⍨2×⍺}/⍳7e3x
Ich konnte dies nicht testen, aber hier ist eine Version in Dyalog APL. Der einzige Unterschied zwischen ihnen ist das Suffix “ x „, das für rationale Zahlen in NARS2000 verwendet wird, aber in Dyalog (oder nicht verfügbar ist) andere Varianten sind online verfügbar, soweit ich weiß).
Es basiert auf der Formel pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
in den Kommentaren unter der akzeptierten Golfscript-Antwort.