Wyzwanie
Liczba plastyczna jest liczbą związaną ze złotym współczynnikiem, o wielu interesujących właściwościach matematycznych. W związku z tym istnieje wiele metod obliczania liczby.
Aby precyzyjnie określić liczbę do celów tego wyzwania, użyjemy następującej definicji (chociaż istnieje wiele równoważnych definicji i możesz użyć dowolnej definicji, o ile dotyczy tej samej liczby):
Liczba plastyczna jest liczbą rzeczywistą ρ taką, że ρ ³ = ρ +1.
Wyzwanie polega na napisaniu programu lub funkcji, która przyjmuje na wejściu liczbę całkowitą x (przy x > 1) i daje przybliżenie do ρ jako wyjścia, tak że im większa jest wartość x , tym bardziej zbliża się do ρ ( z co najwyżej skończonymi wyjątkami; pozostawanie na tej samej wartości liczy się jako „bliżej” w tym celu), a dla dowolnej liczby dodatniej δ , twój program ma pewną wartość x , która daje wynik w granicach δ od ρ .
Wyjaśnienia
- Jeśli wyprowadzasz dane za pomocą metody, która z natury wysyła ciągi znaków (np. Standardowy strumień wyjściowy), możesz sformatować dane wyjściowe albo w systemie dziesiętnym (np.
1.3247179572
), Albo jako stosunek dwóch liczb całkowitych ze/
znakiem między nimi. - Jeśli wypisujesz jako wartość w swoim języku programowania (np. Wracasz z funkcji), musi ona być typu stałego, zmiennoprzecinkowego lub wymiernego. (W szczególności nie można używać typów danych, które przechowują liczby symbolicznie, chyba że są one używane tylko do zachowania stosunku dwóch liczb całkowitych. Więc jeśli używasz Mathematica lub podobnego języka, musisz dołączyć dodatkowe kod, który faktycznie generuje cyfry wyniku).
- Twoja odpowiedź musi działać w hipotetycznym wariancie języka, w którym liczby całkowite mogą być dowolnie duże, a pamięć (w tym stos) jest nieograniczona. Być może nie przyjąć, że zmiennoprzecinkową arytmetyczne w języku polskim jest arbitralnie dokładna, ale musi zamiast używać jej rzeczywistej dokładności (czyli wyprowadzanie liczbę zmiennoprzecinkową tylko będzie to możliwe w językach gdzie dokładność liczb zmiennoprzecinkowych może być kontrolowane w czasie wykonywania).
- x może mieć dowolne znaczenie (o ile jego zwiększenie daje bardziej dokładne wyniki). Wyobrażam sobie, że większość zgłoszeń sprawi, że będzie kontrolować liczbę cyfr danych wyjściowych do wyprodukowania lub liczbę iteracji algorytmu używanego przez twój program do zbieżności na plastikowej liczbie, ale inne znaczenia są dopuszczalne.
Testcase
Oto kilka pierwszych cyfr plastikowego numeru:
1.32471795724474602596090885
Więcej cyfr jest dostępnych w OEIS .
Warunek zwycięstwa
Jak zwykle dla golfa kodowanego , krótszy jest lepszy, mierzony w bajtach. Możesz jednak zamieszczać odpowiedzi, nawet jeśli nie wygrywają, o ile dodadzą coś (np. Inny język lub inny algorytm) do istniejących odpowiedzi.
Odpowiedzi:
Python 2 , 49 bajtów
Wypróbuj online!
Chodzi o to, aby wyrazić
ρ
wρ³=ρ+1
postaci frakcjin/x
, których mianownikx
jest parametrem dokładności wejściowego. Przyjmujemy(n/x)³=n/x+1
i usuwamy mianowniki, aby je zdobyćn³=x²(x+n)
.Ponieważ LHS rośnie
n
szybciej niż RHS, możemy przybliżać punkt równościn
jako najmniejszyn³≥x²(x+n)
. Kod liczy się,n
dopóki tak się nie stanie, zaczynając od tego,x
który jest mniejszy.Mały zapis bajtów polega na podzieleniu obu stron przez
x²
zapisn³/x²≥x+n
(zanegowany wwhile
stanie). Jest to podział podłogi w kodzie, ale utracona część ułamkowa jest znikoma.Zamiast tego zamiast
x
licznika jest umieszczana alternatywa o tej samej długości :Python 2 , 49 bajtów
Wypróbuj online!
źródło
2**input()
raczej niż tylkoinput()
; wówczas każde przybliżenie będzie co najmniej tak dokładne jak poprzednie.Mathematica, 20 bajtów
Wbudowana
Root
funkcja Mathematica daje rozwiązania równania wielomianowegof[x] == 0
.Wyjaśnienie
Próbki we / wy
źródło
Root[x^3-x-1,1]~N~#&
działa dobrze (pomimo tego, że niex
jest to zmienna) dla tej samej liczby bajtów.Mathematica, 27 bajtów
-1 bajt z Martin
-2 bajty z ovs
wkład
wydajność
źródło
Solve[x^3==x+1>2,x]~N~#&
za 24 bajty{{x -> 1.32...}}
jednak. Możesz sprawdzić za pomocą ais, czy jest to prawidłowy format wyjściowy.{1.32...}
rzeczywistości, ale ten format jest prawdopodobnie mniej kontrowersyjny.sed ,
6760 (59 + 1) bajtówWypróbuj online!
+1 za
-E
flagę (ERE zamiast BRE). Zarówno wejście, jak i wyjście są jednoargumentowe: wejście 11111 dla x = 5, np. Wyjście jest ułamkiem dwóch liczb jednoargumentowych: wyżej wspomniane wejście 11111 daje wyjście 11111/1111 (5/4 dziesiętnie).Przybliża liczbę plastyczną jako ułamek między kolejnymi elementami sekwencji Padovana .
źródło
b
komendzie, ale możesz ją jeszcze skrócić, używając pustej etykiety (:
ib
bez argumentów). tio.run/#%23K05N@f@/…t
zamiastb
, więc to całkiem niezła oszczędność. Dzięki :)Mathematica, 27 bajtów
Wykorzystuje skrócone przybliżenie zagnieżdżonej formy sześciennej rodnika √√ (1 + √√ (1 + √√ (1 + ...))) . Chociaż dane wyjściowe zawsze będą miały x-1 miejsc dziesiętnych, wynik jest w rzeczywistości mniej dokładny niż to, ponieważ wyrażenie zbiega się wolniej niż jedna cyfra na iterację ( x jest również używany jako liczba obliczonych rodników zagnieżdżonych). Na przykład x = 100 daje
gdzie podkreślona część jest poprawna.
źródło
dc
, ale przeszkadzało mi to, ponieważ okazuje się, że nie ma on operacji na pierwiastku sześciennym, a podniesienie liczby do potęgi ⅓ też nie działa :-( Przynajmniej zawsze możesz liczyć na Mathematica ma odpowiednie wbudowane…CubeRoot
nikt nie ma na to bajtów.Oktawa , 50 bajtów
Wypróbuj online!
Definiuje anonimową funkcję z
n
żądaną liczbą cyfr wyjścia.Ta odpowiedź nadużywa, która
digits
zwraca bieżące ustawienie liczby cyfr w arytmetyki o zmiennej precyzji. Oznacza to, że możemy go używać w funkcji anonimowej bez błędów dotyczących „Zbyt wielu argumentów wyjściowych”.Poza tym jest to naprawdę proste:
vpasolve
jest skrótem od Variable-Precision Arithmetic Solve, z precyzją ustawioną przez ostatnie wywołaniedigits
. Ponieważvpa
jest to symboliczny typ danych w Octave, który jest zbanowany zgodnie ze specyfikacją, po prostu zawijamy całą funkcję,char(...)
aby uzyskać ciąg znaków. Zauważ, że wsolve
ivpasolve
,f==0
implikowane, więcr^3==r+1
zostało zastąpione przezr^3-r-1 (==0)
źródło
MATL (
2728 bajtów)Moje pierwsze rozwiązanie (27 bajtów)
Wypróbuj online!
To z pewnością nie jest optymalne, wciąż przyzwyczajam się do MATL.
Wyjaśnienie:
Tworzę sekwencję Padovana do wejścia + 3, a następnie znajduję stosunek dwóch ostatnich liczb.
Prawidłowe wyjście ułamkowe
(35 bajtów)(28 bajtów, @ Kanały):Jednak pierwsze rozwiązanie nie spełnia wymogu dowolnej precyzji, która jest zmiennoprzecinkową granicą domyślnych ustawień MATL. Więc zamiast dodając kilka bajtów do rozszerzenia tej precyzji, to prostsze do podjęcia właściwej trasy frakcji i zapisać ułamek ostatnich dwóch liczb całkowitych w (n-1) th i N th elementów ściętego Padovan sekwencji.
np. „114/86”
7BG: „t @) y @ 1 +) + h] tG3 +) V '/' YcyG2 +) VYcDzięki uprzejmości użytkownika @Sanchises. :)
Wypróbuj online!
Ocena bez iteracji:
W szczególności mój najkrótszy kod dla „dokładnej” wersji to (23 bajty):
Wypróbuj online!
... ale nie daje arbitralnej precyzji. Zastanawiam się, czy ktoś może to dostosować, aby spełnić reguły (użyj danych wejściowych itp.) I nadal dodać mniej niż 5 bajtów? : P
źródło
1+
można skrócić do.Q
Mając to na uwadze, możesz wymienić na@)y@1+)+
just@tQh)s
. Ponadto można użyćJ
do wskazania końca tablicy; i wreszcie, Mátl nie rozróżnia normalnych tablic i tablic znaków, więc można zastąpićYc
przezh
(nie trzeba dodatkowych funkcjonalnościYc
). Daje to tylko 28 bajtów:7BG:"t@tQh)sh]tJ)V47hyJq)Vh&
(zwróć uwagę,&
aby zapobiec niepotrzebnemu wyjściu i zastąpienie'/'
go 47).7B
lllv
J
domyślnie zawiera1j
, ale schowekL
zawiera również wiele przydatnych funkcji indeksowania (zwróć uwagę, że w MATL1j
jest równyend
).M ,
1514 bajtówWypróbuj online!
Algorytm
Używa to racjonalności i metody Newtona. W szczególności dla wejścia x stosowane są pierwsze x iteracje o wartości początkowej x .
Próbujemy znaleźć określony pierwiastek wielomianu p (t) = t³ - t - 1 . Metoda Newtona osiąga to poprzez przyjęcie wartości początkowej t 0 - wystarczająco zbliżonej do ρ - i rekurencyjne zdefiniowanie sekwencji przez
t n + 1 = t n - p (t n ) / p '(t n ) .
Ponieważ p '(t) = 3t² -1 , otrzymujemy
t n + 1 = t n - (t n ³ - t n - 1) / (3t n ² - 1) = (3t n ³ - t n - t n ³ + t n + 1) / (3t n ² - 1) = (2t n ³ + 1) / (3t n ² - 1) .
Zauważ, że początkowe przybliżenie x pogarsza się wraz ze wzrostem x . Chociaż wynik dla x = 3 jest nieco mniej dokładny niż wynik dla x = 2 , ponieważ metoda Newtona zbiega się kwadratowo w ρ , nie powinno to stanowić problemu w przypadku dużych wartości x .
Jak to działa
źródło
µ¡
...Julia 0,5 ,
4440 bajtówKorzysta z racjonalności i metody Newtona.
Wypróbuj online!
źródło
05AB1E , 23 bajty
Wypróbuj online!
Bezpośredni port /codegolf//a/126822/59376 przez xnor.
źródło
Węgiel drzewny , 28 bajtów
Wypróbuj online! Link do trybu pełnego. Też najwyraźniej popsułem
Divide
iIntDivide
: |Używa tej samej metody co odpowiedzi w języku Python i JavaScript.
źródło
NewStack , 14 bajtów
Awaria:
Jak to działa:
Wzór (2x 3 +1) / (3x 2 -1) pochodzi z uproszczenia metody Newtona dla równania x 3 = x + 1. Możesz go znaleźć tutaj . Powtarzanie tego procesu nieskończoną liczbę razy zbiega się z liczbą plastyczną. Jego tempo konwergencji jest dość szybkie i wynosi około 2,6 miejsca po przecinku na iterację.
Alternatywa sekwencji Padovan,
272517 bajtówAwaria:
-2 bajty, wybierając lepszą strategię drukowania
-8 bajtów, wybierając lepszy sposób indeksowania stosu
Jak to działa:
W miarę kontynuowania sekwencji Padovana stosunek dwóch ostatnich elementów zbiega się z liczbą plastyczną.
źródło
Clojure, 46 bajtów
Używa iterowanej formuły root-cube. Jest to nieco bardziej interesujące, ale dłuższe:
źródło
JavaScript, 36 bajtów
Działa tak samo jak odpowiedź na górny python. Nie
console.log
zostało uwzględnione, ponieważ jeśli uruchomiszf(x)
konsolę, zostanie automatycznie zalogowane.źródło
> <> , 38 + 3 = 41 bajtów
Oczekuje, że dane wejściowe będą obecne na stosie podczas uruchamiania programu, więc +3 bajty dla
-v
flagi.Wypróbuj online!
Skutecznie wykonuje wyszukiwanie binarne w celu zawężenia wartości wyjściowej. Zwiększenie
x
zwiększa liczbę iteracji do wykonania.Edycja: lekko zmieniono obliczenia, aby zaoszczędzić 1 bajt, poprzednia wersja:
źródło
k, 27 bajtów
Wypróbuj online! Zakłada to nieskończone liczby całkowite (co niestety nie jest prawdziwe). Wykorzystuje sekwencję Padovana .
źródło
TI-BASIC, 21 bajtów
Wykorzystuje tę rekurencyjną formułę .
Co ciekawe, zakodowanie na stałe liczby i zaokrąglenie daje tę samą liczbę bajtów:
TI-BASIC, 21 bajtów
Wykorzystuje ten wzór trygonometryczny .
źródło
Your answer must work in a hypothetical variant of your language in which integers can be arbitrarily large, and memory (including stack) is unlimited. You may not assume that floating-point arithmetic in your language is arbitrarily accurate, but must instead use its actual accuracy (meaning that outputting a floating-point number is only going to be possible in languages where the accuracy of floating-point numbers can be controlled at runtime).
C # , 317 bajtów
Zwraca wynik jako ułamek.
Wyjaśnienie
Wykorzystuje metodę Newtona z iteracjami x do znalezienia pierwiastka wielomianu p ^ 3-p-1 = 0. Formuła to x_n = 1- (f (x_ (n-1))) / (f '(x_ (n-1))), a x_0 jest punktem początkowym.
Pochodna wielomianów wynosi 3p ^ 2-1 i powiedzmy x_ (n-1) = b / c. Następnie, stosując powyższy wzór, otrzymujemy, że x_n = (2 b ^ 3 + c ^ 3) / (3 b ^ 2 cc ^ 3). Powiedzmy też, że zaczynamy od 1, tak się stanie, gdy x = 2, ponieważ x> 1, i jest liczbą całkowitą. Zidentyfikowany i skomentowany kod:
źródło
PHP, 86 bajtów
PHP Sandbox Online
Tworzy spiralę Padovan i wypisuje stosunek dwóch ostatnich liczb.
źródło
Aksjomat, 96 bajtów
wyniki
jak widać h (2) powinien wynosić 1,32, a nie 1,33, więc w ostatnich cyfrach jest błąd
Byłby to jeden ze 110 bajtów
Wykorzystuje wzór na równanie rozwiązywania klasy III typu x ^ 3-3 * p * x-2 * q = 0 w przypadku q ^ 2-p ^ 3> = 0, czyli m = sqrt (q ^ 2- p ^ 3) i x = (q + m) ^ (1/3) + (qm) ^ (1/3)
W naszym przypadku r ^ 3-r-1 = 0 można to zapisać jako r ^ 3-3 * (1/3) r-2 * (1/2) = 0, więc p = 1/3 q = 1/2 m = 1 / 4-1 / 27 = 23/108 x = (0,5 + m) ^ (1/3) + (0,5-m) ^ (1/3)
ten, który używa iteracji Newtona z punktem początkowym r = 1
zmienia się w funkcji, wartość cyfr dla uzyskania jednego obj n + 1 cyfr po punkcie zmiennoprzecinkowym. Na koniec wartość cyfry () jest ponownie przypisywana do wartości dokładności.
źródło
Rubinowy , 35 bajtów
Wypróbuj online!
źródło