Pi jest liczbą nieracjonalną , co oznacza, że jego reprezentacja dziesiętna nigdy się nie kończy ani się nie powtarza.
Pi jest obcięty do 41 cyfr dziesiętnych (40 miejsc) 3.1415926535897932384626433832795028841971
.
Jeśli zignorujemy przecinek dziesiętny i wymienimy cyfry jako ciąg dodatnich liczb całkowitych, unikając duplikatów , otrzymamy 3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 950 28 841 971
( OEIS A064809 ).
(Zauważ, że 15
pojawia się w sekwencji zamiast, 1 5
ponieważ 1
już wystąpił.
Zauważ też, że 0
nie występuje, ponieważ nie jest dodatni; 950
zawiera pierwsze zero.)
Aby skonstruować pierwszą liczbę piracyjną , używamy tej sekwencji do indeksowania cyfr Pi (pierwsza cyfra to 3, druga 1 itd.).
Pierwsza cyfra pierwszego numeru pirracyjnego to trzecia cyfra Pi,
druga cyfra to pierwsza cyfra Pi,
trzecia cyfra to czwarta cyfra Pi,
czwarta to piętnasta cyfra Pi
i tak dalej.
Kropka dziesiętna jest dodawana po pierwszej cyfrze, aby naśladować Pi.
Tak więc jest to pierwsza liczba piracka licząca do 41 cyfr 4.3195195867462520687356193644029372991880
.
(Zauważ, że dla 30 cyfry musiałem przejść do 974 cyfry Pi.)
Aby skonstruować drugą liczbę piracyjną, proces powtarza się przy użyciu pierwszej liczby piracyjnej zamiast Pi. (Sam Pi można nazwać zerową liczbą piracyjną.) Tak więc nowa sekwencja jest, 4 3 1 9 5 19 58 ...
a pierwsza liczba piiracyjna jest indeksowana w celu uzyskania drugiej, która się rozpoczyna 9.14858...
.
Dalsze liczby pirackie są tworzone w ten sam sposób, a każda z nich jest generowana z poprzedniej.
Wyzwanie
Twoim zadaniem jest napisać najkrótszy program, który odbywa się w dwóch liczb całkowitych, N
i D
, i wysyła N
th numer pirrational obciętyD
dziesiętnej cyfry.
D
jest zawsze dodatnia, ale N
nieujemna, a D
cyfry Pi powinny być wyprowadzane, gdy N
wynosi 0.
KiedyD
wynosi 1, nie ma znaczenia, czy przecinek dziesiętny jest obecny, czy nie.
Dane wejściowe powinny pochodzić ze stdin lub wiersza poleceń, a dane wyjściowe powinny przejść do stdout (lub najbliższych alternatywnych języków).
Twój program powinien działać dla wszystkich wartości wejściowych N
i D
poniżej 2 16 , ale nie musi być aktualny ani wydajny.
Najkrótszy kod w bajtach wygrywa.
(Pamiętaj, że liczby pirackie wychodzą z innych baz, ale wszystko w tym wyzwaniu odbywa się w bazie 10.)
N=1
,D=13393
na przykład, że trzeba cyfrę 31 milionowa PIOdpowiedzi:
Python 292 bajtów
Dość nieefektywny, udało mi się uzyskać tylko kilka cyfr N = 3 i żadnej z N = 4.
Przykładowe dane wejściowe:
źródło
=="0"
na<"1"
. Zrób pętlę while podczas jednej linii. Usuń spacje wokółx += 1
.if l not in h
->if(l in h)<1:
N==0
->N<1
if(l in h)<1
jest to również dość sprytne.s
jako parametrP
(def P(N,D,s=''):
).str(...)
można prawdopodobnie napisać za pomocą backticksa.while'1'>...
oszczędza miejsce Zróbh
zestaw i zainicjuj goh=l,={''}
, a następnie napiszl in h
jako{l}<h
.h
zamówienia. Mimo to to fajna sztuczka, którą spróbuję zapamiętać.while j+1:
można skrócić dowhile-~j
, przy okazji.Haskell,
431400369Uwielbiam nieskończone listy! Biorąc pod uwagę wystarczającą ilość czasu i pamięci, ten program ostatecznie obliczy właściwą odpowiedź dla dowolnego N i D (zakładam).
Generuję cyfry pi za
g
pomocą algorytmu czopowego (bezwstydnie skradzionego facetowi o nazwisku Stanley Rabinowitz), grupując cyfry / tworząc sekwencję za pomocąv
i generując z nich liczbę piracyjnąm
.Oto jest w akcji:
źródło