Jest już 30 wyzwań poświęconych pi, ale żaden nie prosi o znalezienie n-tego miejsca po przecinku, więc ...
Wyzwanie
Dla dowolnej liczby całkowitej w zakresie 0 <= n <= 10000
wyświetlania n-ta liczba dziesiętna liczby pi.
Zasady
- Po przecinku są kolejne liczby
3.
- Twój program może być funkcją lub pełnym programem
- Musisz podać wynik w bazie 10
- Możesz uzyskać
n
z dowolnej odpowiedniej metody wprowadzania danych (standardowe wejście, wejście (), parametry funkcji, ...), ale nie zakodowane na stałe - Możesz użyć indeksowania opartego na 1, jeśli jest to język ojczysty dla twojego wybranego języka
- Nie masz do czynienia z nieprawidłowym wejścia (
n == -1
,n == 'a'
lubn == 1.5
) - Wbudowane są dozwolone, jeśli obsługują co najmniej 10 000 miejsc po przecinku
- Środowisko wykonawcze nie ma znaczenia, ponieważ dotyczy ono najkrótszego kodu, a nie najszybszego kodu
- To jest code-golf , wygrywa najkrótszy kod w bajtach
Przypadki testowe
f(0) == 1
f(1) == 4 // for 1-indexed languages f(1) == 1
f(2) == 1 // for 1-indexed languages f(2) == 4
f(3) == 5
f(10) == 8
f(100) == 8
f(599) == 2
f(760) == 4
f(1000) == 3
f(10000) == 5
Dla odniesienia, oto pierwsze 100k cyfr liczby pi.
str(pi())[n+2]
Odpowiedzi:
05AB1E, 3 bajty
Wyjaśnił
Wypróbuj online
Wykorzystuje indeksowanie 1.
Obsługuje do 100 000 cyfr.
źródło
Python 2, 66 bajtów
Dane wejściowe są pobierane ze standardowego wejścia.
Przykładowe użycie
źródło
n
wartość wejściową plus 9, możesz uniknąć parens.L
ciąg do.Bash + coreutils,
6049 bajtówecho "scale=10100;4*a(1)"|bc -l|tr -d '\\\n'|cut -c$(($1+2))
Ulepszony przez Dennisa . Dzięki!
Indeks jest oparty na jednym.
źródło
Python 2,
737173 bajtówdzięki @aditsu za zwiększenie mojego wyniku o 2 bajty
Na koniec algorytm, który można wykonać w ciągu 2 sekund.
Ideone to!
Korzysta z formuły
pi = 4*arctan(1)
podczas obliczeńarctan(1)
za pomocą serii Taylor.źródło
f=lambda n:...
.(lambda n:`p`[n+1])(1)
,(lambda n:`p`[n+1])(2)
...).import
wcześniejszego umieszczania instrukcji, tyle że wcześniej tworzy to niektóre zmienne globalne.i=3 while a:a=i/2*a/i;p+=a;i+=2
za 4.MATL,
1110 bajtów1 bajt zapisany dzięki @Luis
To rozwiązanie wykorzystuje indeksowanie 1
Wypróbuj online
Wszystkie przypadki testowe
Wyjaśnienie
źródło
YP
do testowania symbolicznegoMathematica 30 bajtów
1
4
1
5
8
8
2
4
3
5
źródło
Sage,
3225 bajtówMoja pierwsza odpowiedź w języku tego rodzaju.
n
zaokrąglapi
do 17775 cyfr.źródło
print
połączenia, w przeciwnym razie jest to fragment kodu, który działa tylko w REPL.lambda d:`n(pi,digits=d+5)`[-4]
[-8]
wniosek.CJam, 32
Wypróbuj online (jest trochę powolny)
źródło
Mathematica,
2321 bajtówSageMath, 24 bajty
źródło
Pi
i⌋
(lub pomiędzy#
i⌋
jeśli odwrócenie mnożenia jest odwrócone), więc zapisywanie znika.J ,
1915 bajtówPobiera liczbę całkowitą n i wyświetla n- tą cyfrę pi. Używa indeksowania zerowego. Aby uzyskać n- tą cyfrę, oblicz pi razy 10 n +1 , weź dolną część tej wartości, a następnie weź ją modulo 10.
Stosowanie
Dane wejściowe to rozszerzona liczba całkowita.
Na moim komputerze obliczenie 10000- tej cyfry zajmuje około 18 minut .
Wyjaśnienie
źródło
Clojure, 312 bajtów
Więc, jak zapewne możesz powiedzieć, nie mam pojęcia, co robię. Ostatecznie było to bardziej komiczne niż cokolwiek innego. Zrobiłem Google „pi to n cyfry” i znalazłem się na stronie Wikipedii dla formuły Bailey – Borwein – Plouffe . Znając zaledwie ledwie rachunku różniczkowego (?) Do odczytania wzoru, udało mi się przetłumaczyć go na Clojure.
Samo tłumaczenie nie było takie trudne. Trudność wynikała z obsługi precyzji do n-cyfr, ponieważ wymaga tego wzór
(Math/pow 16 precision)
; który staje się ogromny naprawdę szybko. Musiałem użyćBigDecimal
wszędzie, aby to zadziałało, co naprawdę rozłożyło rzeczy.Nie golfowany:
Nie trzeba dodawać, że jestem pewien, że istnieje łatwiejszy sposób na zrobienie tego, jeśli znasz matematykę.
źródło
Clojure, 253 bajty
Oblicz liczbę pi za pomocą tego wzoru . Muszę przedefiniować makro,
with-precision
ponieważ jest używane zbyt często.Możesz zobaczyć wynik tutaj: https://ideone.com/AzumC3 1000 i 10000 trwa przekracza limit czasowy stosowany na ideone, wzrusza ramionami
źródło
Python 3 , 338 bajtów
Ta implementacja oparta jest na algorytmie Chudnovsky'ego , jednym z najszybszych algorytmów do oszacowania pi. Dla każdej iteracji szacuje się około 14 cyfr ( więcej szczegółów znajdziesz tutaj ).
Wypróbuj online!
źródło
Java 7,
262260 bajtówUżywane @ LeakyNun za Python 2 algorytmu .
Kod niepoznany i testowy:
Wypróbuj tutaj.
Wydajność:
źródło
Smalltalk - 270 bajtów
Polega na tożsamości
tan⁻¹(x) = x − x³/3 + x⁵/5 − x⁷/7 ...
i toπ = 16⋅tan⁻¹(1/5) − 4⋅tan⁻¹(1/239)
. SmallTalk korzysta z nielimitowanej arytmetyki liczb całkowitych, więc będzie działał na dużych wejściach, jeśli zechcesz czekać!Zapisz jako
pi.st
i uruchom jak w poniższych przypadkach testowych. Indeksowanie opiera się na jednym.źródło
JavaScript (Node.js) (Chrome 67+),
75736763 bajtówWypróbuj online!
Za pomocąπ/ 2= ∑∞k = 0k ! / ( 2 k + 1 ) ! ! (ta sama logika, której używa odpowiedź Leaky Nun w Pythonie, ale dzięki składni JS, która czyni to krótszym). Dane wejściowe są przekazywane do funkcji jako BigInt. 2 bajty można usunąć, jeśli stosowane jest indeksowanie 1:
JavaScript (Node.js) (Chrome 67+),
9089 bajtówWypróbuj online!
Za pomocąπ/ 4=arctan( 1 / 2 ) + arctg( 1 / 3 ) . Input is passed to the function as a BigInt. 2 bytes can be removed if 1-based indexing is used:
źródło
Maple, 24 bytes
Test cases:
źródło
C#,
252250 bytesTry it online!
źródło