Każdy wie PI ten stała, stosunek obwodu koła do jego średnicy.
3.14159265358979323846264338327950288419716939937510...
Prawdopodobnie również wiedzieć, e się stała, podstawa logarytmu naturalnego.
2.71828182845904523536028747135266249775724709369996...
Ale ... znasz ciasto ? Jest to jedna z najważniejszych stałych (dla mnie). Są to cyfry pi i e przeplecione.
32.1741185298216852385485997094352233854366206248373...
Jako rozwinięcie dziesiętne:
3, 2, 1, 7, 4, 1, 1, 8, 5, 2, 9, 8, 2, 1, 6, 8, 5, 2...
To jest sekwencja OEIS A001355 .
SŁOWA KLUCZOWE: nonn, base, głupie , łatwe
To bardzo głupia sekwencja.
Wyzwanie
Napisz program / funkcję, która pobierze nieujemną liczbę całkowitą n i wyśle n-tą cyfrę kołka .
Dane techniczne
- Zasady Standard I / O zastosowania .
- Standardowe luki są zabronione .
- Twoje rozwiązanie musi działać na co najmniej 50 cyfr każdej stałej, co oznacza, że powinno działać przez co najmniej 100 terminów sekwencji (proszę nie próbować kodować na stałe: P).
- Wynik dla 2 lub 3 nie jest kropką dziesiętną .
- Twoje rozwiązanie może mieć indeks 0 lub indeks 1, ale określ, które z nich.
- Wyzwanie to nie polega na znalezieniu najkrótszego podejścia we wszystkich językach, chodzi raczej o znalezienie najkrótszego podejścia w każdym języku .
- Twój kod będzie oceniany w bajtach , zwykle w kodowaniu UTF-8, chyba że określono inaczej.
- Wbudowane funkcje, które obliczają tę sekwencję są dozwolone, ale zalecane jest rozwiązanie, które nie polega na wbudowanym.
- Zachęca się do wyjaśnień, nawet w przypadku „praktycznych” języków .
Przypadki testowe
Są one indeksowane na 0.
Input Output
1 2
2 1
11 8
14 6
21 4
24 9
31 5
W kilku lepszych formatach:
1 2 11 14 21 24 31
1, 2, 11, 14, 21, 24, 31
2 3 12 15 22 25 32
2, 3, 12, 15, 22, 25, 32
dumb
oznacza po prostu nieciekawe, bez specjalnych właściwości.pei
nie jestpie
Odpowiedzi:
Mathematica, 50 bajtów
1-indeksowany
źródło
Riffle
, ale moje rozwiązanie pojawia się jeden bajt krótki:RealDigits[If[OddQ@#,Pi,E],10,#][[1,Ceiling[#/2]]]
&Haskell,
154147146 bajtów, BRAK HARDCODING ANI WYKORZYSTYWANIA STAŁYCH BUDYNKÓWTo rozwiązanie oblicza e i pi użyciem szeregów nieskończonych i przechowuje je w arbitralny precyzji liczb stałoprzecinkowych (Haskell wbudowanego
Integer
typu i jejRational
przedłużenia).Nie golfowany:
0-indeksowane. Dokładne dla wejścia 0-99, niedokładne dla wejścia 100-101, poza zakresem poza tym.
Wyjaśnienie:
Oblicza pi przy użyciu tej nieskończonej serii . Oblicza e za pomocą klasycznej odwrotnej serii silni . Teoretycznie nie są to idealne formuły do użycia, ponieważ nie są zbyt zwięzłe pod względem liczby bajtów, ale były to jedyne, które mogłem znaleźć, które zbiegły się wystarczająco szybko, aby umożliwić weryfikację dokładności (inne kwoty wymagały setek tysięcy, jeśli nie miliony terminów). W wersji golfowej e jest obliczane z dużo większą precyzją niż jest to konieczne w celu zminimalizowania liczby bajtów. Obie stałe są obliczane na nieco więcej cyfr, niż jest to konieczne, aby uniknąć błędów zaokrąglania (które są odpowiedzialne za niewygodne ogony nieprawidłowych wartości).
Stałe są obliczane jako iloraz liczb całkowitych dowolnej dokładności (
Rational
), a następnie pomnożone przez 10 ^ 50, aby wszystkie niezbędne cyfry pozostały nienaruszone, gdy stosunek zostanie przekształcony na liczbę całkowitą (dowolnej dokładności) (Integer
). Pozwala to również uniknąć problemu unikania kropki dziesiętnej w reprezentacjach ciągów liczb, z których funkcja alternatywnie pobiera znaki.źródło
Taxi , 749 bajtów
Wypróbuj online!
Próba obliczenia pi lub e programowo w Taxi byłaby koszmarem, chociaż jestem pewien, że da się to zrobić. Dlatego o wiele krócej jest po prostu wpisać na stałe pierwsze 100 cyfr w sekwencji. Wydaje się dość tani, ale jest to zdecydowanie najkrótszy kod Taxi, który spełnia to wyzwanie.
Na stałe koduje sekwencję jako ciągi znaków, przyjmuje
n
, a następnie iteruje wn
dół i za każdym razem usuwa pierwszy znak w ciągu. Kiedyn=0
wypisz pierwszy znak. Jest to jeden indeks.Nie golfowy / sformatowany:
źródło
Python 2 , 88 bajtów
-4 bajty dzięki podstawowej idei konwersji @EriktheOutgolfer .
Wypróbuj online!
Python 2 + sympy , 92 bajty
0-indeksowane. Dziękuję Rodowi za przypomnienie, żebym przestawił się na
from sympy import*
, o którym wcześniej zapomniałem.Wypróbuj online!
Python 2 , 114 bajtów
Myślę, że najkrótszym rozwiązaniem jest kodowanie na stałe, ponieważ Python nie ma przydatnych wbudowanych funkcji.Wypróbuj online!
Python 2 , 114 bajtów
Równoważne rozwiązanie autorstwa @totallyhuman .
Wypróbuj online!
źródło
05AB1E , 10 bajtów
Wyjaśnienie:
0-indeksowane.
Wypróbuj online!
źródło
žt
wtedy nie była to nieskończona lista, dlatego Okx używa pierwszych 100 cyfr e w swoim programie. Zmiana go na nową wersję 05AB1E (gdzie pi i e są nieskończoną listą) nadal nie działałaby w twojej obecnej wersji, ponieważ zipJ
tworzyłby pary, a oin dołączyłby do tych par zamiast wszystkiego. 9 bajtów jest nadal możliwe, zastępującJ
jeS
w nowej wersji, gdzieS
czyni to spłaszczoną listę znaków / cyfrPython 3 ,
8380 bajtów0-indeksowane.
Wypróbuj online!
Jest tam kilka niedrukowalnych znaków, których nie można poprawnie zobaczyć w przeglądarce.
Działa to poprzez zbudowanie krotki
(32, 17, 41, 18, 52, ...)
z kodów ASCII znaków w zakodowanym testowaniu. Krotka jest konwertowana na ciąg'3217411852...'
, z którego wybieramy właściwą cyfrę.źródło
Polyglot, 108 bajtów
Pracuje w:
Myślę, że jest to najkrótsza czynność, jaką można wykonać w języku C #, ponieważ jest to 252 bajty do znalezienia N-tej dziesiętnej liczby pi .
źródło
Java 8,
420417413404380358 (obliczone) i115110 (zakodowane na stałe) bajtówObliczony (
420417413404380358 ):Wypróbuj tutaj.
Udowodnij, że wyświetla poprawny wynik dla wymaganych 100 pozycji.
Na stałe: (
115110 bajtów ):Wypróbuj online.
0-indeksowane
-9 i -5 bajtów dzięki @Nevay .
-24 bajty dzięki @ceilingcat .
Prosiłeś o to ..;)
Java jest wbudowana
Math.PI
iMath.E
jest podwójna, a jej maksymalna precyzja wynosi zaledwie 16. Dlatego będziemy musieli sami obliczyć obie wartości, używającjava.math.BigInteger
i / lubjava.math.BigDecimal
.Ponieważ już obliczałem PI w innym wyzwaniu , użyłem tego samego kodu przy użyciu
BigInteger
. Wykorzystuje jednak algorytm liczby EuleraBigDecimal
.Wynikowe
p
ie
dlatego są:31415...
i2.718...
.Prawdopodobnie mógłbym zagrać w golfa tylko przy użyciu
BigDecimal
, ale dawał niepoprawne odpowiedzi dla PI, więc teraz używam obuBigDecimal
iBigInteger
.Wyjaśnienie:
źródło
(d+=2)
na++d
ireturn p%10+1
po prostureturn p%10
.You've asked for it.. ;)
Hej, podoba mi się twój pierwszy. Dostałem o wiele bardziej zakodowane odpowiedzi, niż się spodziewałem ...charAt(n+1>>1)
i 5 bajtów w wersji na stałe za pomocą odwołania do metody"..."::charAt
.Ziarno , 6015 bajtów
Seed odpowiada mojej odpowiedzi Befunge. Jak już wspomniałem, program Befunge to wyjście nie działa na TIO, ponieważ wydaje się, że TIO ma wewnętrzne zawijanie wierszy o długości 80 znaków.
źródło
Excel, 113 bajtów
1-indeksowany
PI()
jest dokładny tylko do 15 cyfr. Podobne dlaEXP(1)
.6042 bajtowe rozwiązanie, które działa na dane wejściowe<=30
(-18 bajtów dzięki @Adam)źródło
if(...)
instrukcji:=MID(IF(ISODD(b1),PI(),EXP(1)/10)/10,b1/2+3,1)
.Nie można obejść się z niedokładnościąpi()
iexp()
, chociaż05AB1E , 13 bajtów
Wypróbuj online!
Podobne do odpowiedzi Magii, ale trochę inne.
Wyjaśnienie:
źródło
Python 2 + SymPy ,
7063 bajtówWypróbuj online!
źródło
Japt , 55 bajtów
Przetestuj online! Zawiera kilka niedrukowalnych.
Działa, zastępując każdy znak w ciągu jego kodem znaków, a następnie zwracając cyfrę o poprawnym indeksie. Ciąg został wygenerowany przez ten program:
Przetestuj online!
źródło
Julia, 63 bajty
1-indeksowany
Konwertuje pi lub e na ciąg, usuwa miejsce dziesiętne, a następnie wywołuje odpowiednią cyfrę. Zwraca znakową reprezentację cyfry.
źródło
Seed,
58525794Na podstawie odpowiedzi TehPers Befunge.
źródło
Malbolge Unshackled (wariant rotacji 20 trytów), 3,64E6 bajtów
Rozmiar tej odpowiedzi przekracza maksymalny rozmiar programu do wysłania (eh), więc kod znajduje się w moim repozytorium GitHub (uwaga: nie kopiuj kodu za pomocą CTRL + A i CTRL + C, wystarczy kliknąć prawym przyciskiem myszy i kliknąć „Zapisz element docelowy jako. .. ”).
Jak to uruchomić?
Może to być trudna część, ponieważ naiwny tłumacz Haskell będzie potrzebował wieków, aby to uruchomić. TIO ma przyzwoitego tłumacza Malbogle Unshackled, ale niestety nie będę mógł go używać (ograniczenia).
Najlepszy, jaki udało mi się znaleźć, to stały wariant szerokości rotacji 20-trytów, który działa bardzo dobrze, obliczając (prawie) natychmiast .
Aby nieco przyspieszyć tłumacza, usunąłem wszystkie kontrole z nieskrępowanego tłumacza Matthiasa Luttera.
źródło
05AB1E , 14 bajtów
Wypróbuj online!
Ta odpowiedź ma indeks 0.
źródło
'.K
sięþ
i usunąć<
. (Nie wiem, dlaczego nawet obejmowały<
, ponieważ stwierdzić odpowiedź jest 0-indeksowane Aktualna odpowiedź to 1-indeksowane z.<
.),
ponieważ zip robi to domyślnie, ale widzę, że jest to prawie dokładnie to samo, co inna 10-bajtowa odpowiedź ..Python 3 + SymPy , 109 bajtów
0-indeksowane Wypróbuj online!
Pokonaj kodowanie twarde o 5 bajtów !! Ale prawdopodobnie mogłoby być lepiej. Ale bicie twardego kodu sprawia, że czuję się dobrze :)
źródło
Pyth, 35 bajtów
Zestaw testowy
Ponieważ Pyth nie ma wbudowanych stałych pi i e o dowolnej precyzji, obliczam je bezpośrednio.
Obliczanie pi:
Wykorzystuje następujące nawrót do obliczenia ułamka pi:
2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
. Mam to z innej odpowiedzi PPCG . Wywodzi się to w równaniach 23-25 tutaj .Obliczam to od środka, odrzucając wszystkie warunki poza 1024., ponieważ późniejsze terminy mają niewielki wpływ na liczbę i zachowuję 99 cyfr dokładności, aby upewnić się, że pierwsze 50 jest poprawne.
Obliczanie e:
Sumuję odwrotność pierwszych 1024 liczb z dokładnością do 99 cyfr.
Następnie przekształcam obie liczby na ciągi, przeplatam je i indeksuję.
źródło
MATLAB, 93 bajty
Prostym wyjaśnieniem jest to, że najpierw konwertuje e i pi na ciągi, a następnie przechodzi przez pętlę for łączącą cyfry. Tutaj c jest ciastem, p jest pi, a e jest e.
Podzieliłem to również na kilka wierszy w celu zapewnienia czytelności, ale rzeczywisty kod jest w jednym wierszu z minimalnymi odstępami.
źródło
n
wygenerowałanth
cyfrę sekwencji Pie. Możesz także zmniejszyć liczbę bajtów, zmniejszając nazwy zmiennych do jednego znakuinput('')
zamiastinput('n')
C # + BigDecimal ,
377372 bajtówZaoszczędź 5 bajtów dzięki @Kevin Cruijssen.
Brak linku TIO z powodu zewnętrznej biblioteki, niestety C # nie ma wbudowanej
BigDecimal
klasy, więc ta zewnętrzna będzie musiała to zrobić. Prawdopodobnie trochę golfa wciąż jest możliwe, ale teraz nie ma czasu.Pełna / sformatowana wersja:
źródło
x[j++]/e
coc=(x[j++]/e)*n
do -2 bajtów; Myślę też, że można usunąć obie+""
z dwóch instrukcji return i zwrócić int zamiast łańcucha, a następnie dodać-48
w drugiej instrukcji return, aby przekonwertować char na int (z bajtu -1).Python 2 , 82 bajty
Wypróbuj online!
Zawiera niektóre niedrukowalne znaki ASCII. flornquake oszczędził dwa bajty.
źródło
lambda n:('%02d'%ord('...'[n/2]))[n%2]
, chociaż prawdopodobnie jest coś lepszego.pieprzenie mózgu , 402 bajty
Wypróbuj online!
Wprowadź jako kod znakowy (np. „A” = 65)
Wypróbuj online z cyfrowym wprowadzaniem!
kod:
źródło
Neim , 45 bajtów
neim nie jest stworzony dla liczb dziesiętnych
Wypróbuj online!
źródło
Befunge , 105 bajtów
Nie działa w TIO, ponieważ z jakiegoś powodu wydaje się, że zawija linie do 80 znaków. Możesz sprawić, by działał na TIO, umieszczając każdą cyfrę w nowej linii i umieszczając cyfrę
&0g,@
po3
pierwszej linii.źródło
JavaScript (ES6) + mathjs , 78 bajtów
Zero indeksowane i działa do 128 liczb (maks. Wejście 127).
Test Snippet
źródło
MATLAB (z / Symbolic Toolbox),
8982 bajtówKorzystając z Symbolic Toolbox, ta odpowiedź daje wynik bez twardego kodowania wartości pi i e.
Jako zabawny bonus ten kod jako dane wejściowe może przyjmować pojedynczy indeks lub tablicę indeksów i jednocześnie zapewnia wartość wyjściową dla wszystkich podanych wartości indeksu (np. Zapewnienie 1:10 spowoduje wygenerowanie pierwszych 10 wartości).
(dodano nowe wiersze w celu zapewnienia czytelności, nie są wymagane do wykonania, więc nie są uwzględniane w liczbie bajtów)
Niestety wersja Octave używana przez TIO nie obsługuje symbolicznych danych wejściowych do
vpa
funkcji, więc nie można podać w linku TIO.W MATLAB indeksowanie wektora zwrotnego z funkcji nie jest możliwe w taki sam sposób, jak w przypadku Octave, co oznacza, że jest to pełny program, a nie tylko funkcja anonimowa. Program zapyta o dane wejściowe
n
podczas wykonywania - jest to wartość zindeksowana, dla której wymagany jest element. Pod koniec programu wartość jest domyślnie drukowana.W programie wykorzystujemy
vpa
funkcję, która zapewnia do 51 miejsc po przecinku wartośćpi
iexp(1)
(e). Odbywa się to symbolicznie, aby umożliwić teoretycznie nieskończoną precyzję. Aby rozwinąć o ponad 100 elementów, po prostu zwiększ wartość51
w kodzie, aby zwiększyć zakres.Owijanie
vpa
wchar
(tjchar(vpa(...))
) jest niezbędne do przekształcenia wyjście funkcji na ciąg zamiast wartości symbolicznej. Wynikowy wynik to ciąg znaków:Obejmuje to zarówno e, jak i pi do 51 miejsc po przecinku - wystarczy, aby pozwolić na 100 cyfr naszego wyjścia (musimy zrobić trochę więcej dp niż jest to wymagane, aby uniknąć drukowania zaokrąglonych wartości)
Aby zaindeksować ten bałagan, musimy przynajmniej pozbyć się miejsc po przecinku, aby oba ciągi cyfr były ciągłe. Pierwotnie użyłem prostego wyrażenia regularnego wszystkiego, co nie jest cyfrą z niczym. Jednak mogę zapisać 7 bajtów, pozbywając się przecinka dziesiętnego za pomocą kodu:
wynikowy ciąg jest teraz:
Zawiera wszystkie potrzebne nam cyfry, zarówno w odcinkach pi, jak i e, w kolejnych indeksach.
Następnie możemy przekonwertować dostarczony indeks w taki sposób, że liczby nieparzyste uzyskują dostęp do porcji pi, a liczby parzyste uzyskują dostęp do porcji e za pomocą obliczeń:
Dostęp do tego (tych) indeksu (indeksów) w powyższym ciągu zapewni prawidłowe wyjście.
źródło
Aksjomat, 148 bajtów
Tablica oparta na 0. Wyniki
źródło
Arkusze Google, 47 bajtów
Anonimowa funkcja arkusza roboczego, która pobiera dane z komórki
A1
i wysyła cyfrę Pie do komórki wywołującejWersja na stałe, 112 bajtów
Ta wersja w pełni spełnia specyfikację programu, ale ogólnie nie jest fajna.
Anonimowa funkcja arkusza roboczego, która zwraca n-tą cyfrę na 1-indeksowanej liście kołków
źródło
BFASM , 142 bajty
Pobiera dane wejściowe jako znak ascii, podaje dane wyjściowe w postaci cyfr.
źródło