Wyzwanie:
Pi ma być nieskończony. Oznacza to, że każda liczba jest zawarta w części dziesiętnej liczby pi. Twoim zadaniem będzie przyjęcie dodatniej liczby całkowitej na wejściu i zwrócenie pozycji tej liczby cyframi pi na wyjściu.
Na przykład, jeśli dane wejściowe są 59
, wrócimy4
Oto dlaczego: szukamy liczby 59
w cyfrach pi
3.14159265...
^^
Wartość zaczyna się od 4 cyfry, więc wyjście będzie 4
.
Kilka innych przykładów:
input : 1 output : 1
input : 65 output : 7
input : 93993 output : 42
input : 3 output : 9
Zasady:
- Nie musisz obsługiwać cyfr, które nie istnieją w ciągu pierwszych 200 cyfr
- Standardowe luki są, jak zawsze, zabronione.
- To jest codegolf , więc wygrywa mniej bajtów.
n
indeks 0-indeksowany ? Tak więc przypadki tekstowe wrócą0, 6, 41, 8
zamiast1, 7, 42, 9
.Odpowiedzi:
Python 2,
69757167 bajtówZaoszczędzono 4 bajty z powodu Cairney Coheringaahing .
Nie znajdowanie
3
na pozycji zero kosztuje62 bajty. Dane wejściowe są podawane jako ciąg.Wypróbuj online!
Wersja bez ograniczeń
Python 2, 224 bajty
Korzystanie z niezwiązanego czopa opartego na tej samej formule, co powyżej.
Wypróbuj online!
Szybsza wersja
Znacznie szybszy niezwiązany czop, oparty na Ramanujan # 39 .
Wypróbuj online!
źródło
Łuska , 5 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
€
) z usuniętym pierwszym elementem (pierwsze 3) (t
) cyfr PI (İπ
), przekonwertuj go na base-10 (d
) i wyślij do STDOUT (niejawnie).İπ
to nieskończona lista cyfr, utworzona przy użyciu nieograniczonego źródłaExcel, 212 bajtów
Excel obsługuje tylko 15 miejsc po przecinku, więc pi jest po prostu zakodowane na stałe. To powinno być dość słabe górne ograniczenie tego wyzwania.
źródło
CONCAT
i formuła BBP obliczyć pierwsze 200 cyfr gatunku-base16 i szukać w szesnastkowym? (Nie mam 365, więc nie mogę przetestować)CONCAT
,CODE
aMID
ja zmniejszył ciąg PI z 202 znaków (notowań Inc) do 143:CONCAT(CODE(MID(".ÜÁ£ÙÏ ¦®š«¦ ϲœÔ“ÇŧÝËŠº”ᱬ»—‡ÑÀ†œ¾ˆãÖœƒ°™¢•‘†ÏÒŽÐÖ³ Ҟ¯‰¦¬¼ß²º–ŸÈµ»¨Ñœ°‹‘‚ÔŠ›ÝÕ•Š·»À®–Þٶ݃Ñà",2*ROW(A1:A100)-1,2))-32)
Java 8,
615217202184182 182166165 bajtów (obliczone999200 cyfr)1-indeksowany
Wypróbuj online.
Wbudowana Java
Math.PI
ma dokładność 15 wartości dziesiętnych, podobnie jak wiele innych języków. Aby mieć więcej cyfr, musisz je obliczyć samodzielnie za pomocąBigIntegers
lubBigDecimals
. Powyższy sposób to zrobić.Może ktoś możezagrać wgolfa poniżej 211 bajtów, lol ..EDYCJA: Utworzono port odpowiedzi @primo na Python 2 (pamiętaj, aby go głosować!), Więc obliczanie jest krótsze niż trudne -coded nie jest już do tej pory pobierane.
Jeszcze 7 bajtów do gry w golfa, aby był krótszy.-15 bajtów dzięki @Neil , dzięki czemu jest krótszy niż na sztywno zakodowana odpowiedź poniżej!
-36 bajtów dzięki @primo .
-1 bajt zmienia się
java.math.BigInteger t=null,T=t.TEN.pow(200),r=T;
navar T=java.math.BigInteger.TEN.pow(200);var r=T;
, ponieważvar
jest o 1 bajt krótszy niżnull
(muszę pokochać nową Javę 10).Wyjaśnienie:
Java 8, 211 bajtów (na stałe 200 cyfr)
0-indeksowane
Wypróbuj online.
źródło
!p.equals(t.ONE)
być może?indexOf(n,1)-1
Myślę też, że działa. Lub zapisz 2 bajty i zmień na 1 indeks.indexOf
metoda pomijania pierwszychm
znaków. TIL, dzięki!p
za każdym razem o jeden (for(int p=667;p-->1;)
), a następnie pomnożyć przezp
i podzielić przezp-~p
.r
może być dosłownie dowolna, chociaż wartości ekstremalne będą wymagały więcej iteracji. Najlepsze ziarno (najmniej iteracji) jest w rzeczywistości4e200
.05AB1E , 6 bajtów
Wypróbuj online!
W jaki sposób?
źródło
3
tak się nie udajeMATL ,
1615 bajtówWypróbuj online!
Wyjaśnienie
źródło
Pakiet numerów R +, 52 bajty
Wypróbuj online!
dropletPi
oblicza pierwsze 200 cyfr dziesiętnych z,pi
ale zawiera3.
na początku, więc usuwamy to za pomocą,substring
a następnie dopasowujemy doregexec
, co zwraca indeks dopasowania wraz z pewnymi metadanymi dotyczącymi dopasowania.źródło
regexpr(scan(),numbers::dropletPi(200))-2
?"if"
?3.
(zakładam, że mamy do czynienia z liczbami całkowitymi, a nie rzeczywistymi na wejściu). Przykłady testowe działają z tym.regexpr(3,numbers::dropletPi(200))-2
wraca,-1
kiedy powinien wrócić9
, spróbujGalaretka , 23 bajty
Monadyczny link akceptujący listę znaków (liczba całkowita do znalezienia) i zwracający indeks. Działa dla danych wejściowych zawartych w pierwszych 252 cyfrach części dziesiętnej π.
Wypróbuj online!
W jaki sposób?
Wykorzystuje to wzór Leibniza dla π do obliczenia pierwszych 253 cyfr, w tym wiodących
3
(plus cztery niepoprawne cyfry końcowe). Prowadzenie3
jest następnie usuwane i znajduje się indeks danych wejściowych:Jeśli wolisz listę cyfr jako wejściową
⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊw
(także 23), a jeśli naprawdę chcesz nadać jej liczbę całkowitą⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊwD
(dla 24).źródło
BASH (GNU / Linux),
756766 bajtówZaoszczędzony 1 bajt dzięki Sophii Lechner i 7 bajtów dzięki szarlatanowi Krowy.
To jest skrypt powłoki, który przyjmuje pojedynczy argument, którym jest liczba. Przetestuj za pomocą
Ten skrypt najpierw wykonuje potok trzech poleceń:
Wynik tego potoku jest przypisywany do zmiennej powłoki
a
, która jest następnie wywoływana echem po usunięciu pierwszej liczby:Niestety
bc
ma tendencję do przerywania linii wyjściowych, gdy stają się zbyt długie. Może to prowadzić do błędnych wyników, jeśli znaleziony numer nie znajduje się w pierwszym wierszu. Można tego uniknąć, ustawiając zmienną środowiskowąBC_LINE_LENGTH
:To całkowicie wyłącza funkcję łamania linii.
Oczywiście ostatnie dwa polecenia mogą zostać pominięte, jeśli inne dane wyjściowe są tolerowane.
Daje to liczbę 48 bajtów :
Z wynikowym wynikiem:
źródło
-l
i<<<
choć.sed
(patrz druga część mojej odpowiedzi). Niemniej przekształcenie w program dało mi 7 bajtów, więc dziękuję za to! Zamieniłem teżtr
/head
combo na zmienną magię powłoki teraz, aby zapisać kolejny bajt.JavaScript,
197187-10: Dzięki, Neil !
Pobiera serię dziewięciocyfrowych liczb całkowitych base-36, konwertuje je na base 10 i łączy je, aby utworzyć pierwsze 200 cyfr liczby pi.
źródło
x=>'50...'.replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1
aby zapisać 10 bajtów.Pierwszy raz uprawiam golfa kodowego. Użyj delegatów i wyrażeń lambda, aby zredukować wywołania funkcji. V2 skraca nazwę klasy do jednego bajtu.
[C #],
361355 bajtówWersja sformatowana:
Ideone!
Uwaga: błędnie przeliczyłem pierwszą wersję. Miał 361 bajtów, a nie 363 bajtów.
[C #], tio wersja 218 bajtów
Wypróbuj online!
źródło
using System;f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;
jako edycję.Haskell ,
208120 bajtówWypróbuj online!
Bardzo dziękuję Jonathanowi Allanowi za jego sugestie!
Stara wersja (208 bajtów)
Tak naprawdę nie wiem, jak działa powyższy kod; Wziąłem go z tego artykułu i wszystko, co wdrożyłem, to część przeglądowa.
g(1,0,1,1,3,3)
zwraca cyfry pi i jest zaskakująco skuteczny (oblicza 10 000 cyfr na tio.run w mniej niż 4 s).Dane wejściowe to lista składająca się z cyfr numeru, który można znaleźć.
Wypróbuj online!
źródło
l=4*sum[((-1)**x/(2*x+1))|x<-[0..1e6]]
, ale uruchomienie zajmuje 5 sekund, a siódma cyfra jest już niepoprawna. Dlatego obliczenie 200 cyfr może być niewykonalne. To i tak było ciekawe ćwiczenie, więc dzięki!g1_ref
w sekcji Szybsze generatory niezwiązane . Kod to python.Haskell, 230 bajtów
Używanie lenistwa do znajdowania numeru w dowolnym miejscu nieskończonych cyfr pi, nie tylko pierwszych 200 cyfr. O tak, i zwraca ci każdą (nieskończenie wiele) liczbę wystąpień liczby, nie tylko pierwszą.
Przykłady z wyzwania
Kredyty
„p” to nieskończony strumień cyfr pi, zaczerpnięty z https://rosettacode.org/wiki/Pi#Haskell
źródło
SmileBASIC,
179164 bajtówCyfry pi są zakodowane na stałe i pakowane w wartości ascii znaków. 14 ->
CHR$(14)
, 15 ->CHR$(15)
, 92 ->\
, 65 ->A
, 35 ->#
.Ciąg zawiera znaki niedrukowalne, więc oto bajty zapisane szesnastkowo:
0E 0F 5C 41 23 59 4F 20 26 2E 1A 2B 26 20 4F 32 1C 54 13 47 45 27 5D 4B 69 52 00 61 31 2C 3B 17 00 4E 10 28 3E 56 14 59 62 3E 50 03 30 19 03 2A 75 00 43 62 15 30 00 56 33 20 52 1E 42 2F 00 5D 54 2E 00 5F 32 3A 16 1F 48 35 3B 28 51 1C 30 6F 4A 32 1C 29 00 1B 00 13 26 34 6E 37 3B 40 2E 16 5E 59 36 5D 00 26 13 06
W systemie dziesiętnym widoczne są cyfry pi:
14 15 92 65 35 89 79 32 38 46 26 43 38 32 79 50 28 84 19 71 69 39 93 75 105 82 0 97 49 44 59 23 0 78 16 40 62 86 20 89 98 62 80 3 48 25 3 42 117 0 67 98 21 48 0 86 51 32 82 30 66 47 0 93 84 46 0 95 50 58 22 31 72 53 59 40 81 28 48 111 74 50 28 41 0 27 0 19 38 52 110 55 59 64 46 22 94 89 54 93 0 38 19 6
źródło
Rubinowy ,
3735 bajtówWypróbuj online!
Nic specjalnego, tylko prezentacja wbudowanej biblioteki. Wyjście jest indeksowane na 0. Łańcuch Pi jest sformatowany jako
0.31415...e1
, więc musimy usunąć pierwsze 3 znaki.e1
Część w końcu naprawdę nie wyrządzić żadnej szkody, ale odpędza się też, że musimy zapewnić końcowy zakres (lub długość Slice) wartość tak.źródło
Węgiel drzewny ,
2715 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Działa do prawie 1000 cyfr. Wyjaśnienie:
źródło
Japt ,
186177 bajtówPonieważ Japt dzieli 15-cyfrowe ograniczenie Javascript i pi sho , kodowanie stosowane przez Japt nie koduje liczb, niektóre shenanigany są wymagane do kompresji.
Krótko wyjaśnione, początek jest poniższym ciągiem w postaci zakodowanej:
Który jest ciągiem, w którym znajduje się każda litera
'm' + corresponding digit of pi
. Przetestowałem cały alfabet i ta litera zapewnia najlepszą kompresję o kilka bajtów.Backticks nakazują Japtowi odkodować ciąg. Reszta jest dość prosta:
Zwraca indeks pasującego fragmentu na podstawie 0.
Ogolił kolejne dwa bajty dzięki Oliverowi .
Wypróbuj online!
źródło
£X
z®
i}
zÃ
AWK- M,
131 119117 bajtówUżywa
-M
flagi do dowolnych obliczeń precyzji. Dodanop=k=0
(5 bajtów) do łącza TIO, aby umożliwić wprowadzanie wielu wierszyWypróbuj online!
Wyjaśnienie:
źródło
sprintf
na uzyskaniu miejsc po przecinku. KorzystanieCONVFMT
jest zdecydowanie czystsze.-M
flagą”Galaretka , 24 bajty
Wypróbuj online!
Użyj formuły podobnej do Machina , a konkretnie 1/4 pi == tan -1 (1/2) + tan -1 (1/3).Użyj wzoru pi / 2 == 1 + 1/3 × (1 + 2/5 × (1 + 3/7 × (1 + 4/9 × (...))))
źródło
ØP
M?floor
. Zastanawiasz się, czy użyję tego, aby opublikować jako odpowiedź w M?Python 2
239238229214 bajtów-9 bajtów z powodu @primo
Wykorzystuje algorytm Chudnovsky-Ramanujan aby znaleźć pierwsze
1 mln cyfry50000 cyfr Õ (zmiana10**10**5
na10**10**6
dłużej, ale to trwa wieki, aby uruchomić), a następnie przeszukuje je w żądanej ciąg.źródło
n=10**10**5
zajmuje to około 10 sekund).10**10**6
na mojej maszynie zajmuje około 7 minut. Szczerze10**10**5
mówiąc , daje pierwsze 50000 cyfr, więc chyba też nie jest aż tak źle :)gmpy2
, alebigfloat
oszczędza kilkanaście bajtów. Przypisaniek
można połączyć,k=b=0
jeśli przejdzieszk+=1
na początek iteracji.-(6*k-5)*(2*k-1)*(6*k-1)
można napisać bardziej zwięźle jakok*(k*(108-72*k)-46)+5
. Jeśli zadeklarujesz Python 2,//
liczby całkowite mogą być zastąpione przez/
, a także nawiasy nie są konieczneprint
. Można również usunąć miejsceimport*
. Sprawdza tylko 50000 cyfr, btw.n
Wsqrt(10005*n)
wydaje się być problemem; przesuwa przecinek dziesiętny na 50000 miejsce. Jeśli jesteś zainteresowany, oto moja własna implementacja Chudnovsky'ego: Wypróbuj online!Visual Basic - 114 bajtów
Dobra, pierwsze zgłoszenie. Uspokój się!
Witamy mile widziane!
Nie ograniczyłem się do pierwszych 256 części PI, ponieważ pytanie brzmi „Nie musisz”, a nie „Nie powinieneś” Mam nadzieję, że robię to dobrze :)
źródło
JavaScript 217 bajtów (200 na stałe)
źródło
PHP, 27 bajtów
Niezbyt serieusowa odpowiedź, wymaga zmiany ustawień php.ini, ponieważ domyślnie pi () ma 14 cyfr, a nie 200, ale raz rozwiązanie PHP jest dość eleganckie:
źródło
precision
tag w php.ini tylko zmienia precyzyjny wyświetlacz, a nie faktycznie zwiększyć precyzję zdefiniowanych stałych. świadekJulia 0.6 , 53 bajty
Ustaw wystarczająco wysoką precyzję dla BigFloats, a następnie przekonwertuj
pi
na ciąg i wyszukaj. Precyzja9^6
uchwytów 159980 cyfr.Wypróbuj online!
źródło
J, 25 bajtów
Wypróbuj online!
Indeksowane 0
Pobiera dane wejściowe jako ciąg znaków, +2 Bytes (
":
), jeśli nie jest to dozwolone.Wyjaśnienie w końcu.
źródło
Perl 5 z
-MMath::BigFloat+bpi
a-n
, 20 bajtówWypróbuj online!
Nie jestem pewien, gdzie korzystanie z
$>
trybun, ponieważ jest toEFFECTIVE_USER_ID
, co nie jest przenośny, ale na TIO to 1000 i spełnia nasze wymagania, do -1 bajt vs200
.źródło
Łuska , 5 bajtów
Wypróbuj online!
źródło