Celem tego kodu golfa jest stworzenie programu lub funkcji, która oblicza i wyprowadza pierwiastek kostki z liczby podanej jako dane wejściowe.
Zasady:
- Brak zasobów zewnętrznych
- Bez użycia wbudowanych funkcji rootowania kostki.
- Bez użycia metod / operatorów, które mogą podnieść liczbę do potęgi (w tym pierwiastek kwadratowy, czwarty pierwiastek itp.).
- Twoja funkcja / program musi być w stanie akceptować liczby zmiennoprzecinkowe i liczby ujemne jako dane wejściowe.
- Jeśli pierwiastek kostki jest liczbą zmiennoprzecinkową, zaokrąglij ją do 4 liczb po przecinku.
- To jest golfowy kod, wygrywa najkrótszy kod w bajtach.
Przypadki testowe:
27 --> 3
64 --> 4
1 --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7 --> 1.9129
Możesz użyć wszystkich powyższych przypadków testowych do testowania liczb ujemnych ( -27 --> -3
, -64 --> -4
...)
Odpowiedzi:
J: 16 znaków
Luźne tłumaczenie odpowiedzi Haskella:
Przypadki testowe:
Działa to tak:
W słowach:
Nie jest to jedno z najlepszych nieporadnych tłumaczeń, ponieważ
~
na końcu widmowy widelec .źródło
Haskell - 35
Przykładowe przebiegi:
Co więcej, jeśli zaimportujesz
Data.Complex
, działa nawet na liczbach zespolonych, zwraca jeden z pierwiastków liczby (są 3)::+
Operator powinien być odczytywany jako „plusa I czasy”źródło
x=(2*x+n/x/x)/3
, czy możesz wyjaśnić, dlaczego możesz jej użyćx=(x+n/x/x)/2
? Zbiega się wolniej, ale nie potrafię wyjaśnić, dlaczego się zbiega ...x=cbrt(n)
,x=(x+n/x/x)/2
to prawda. Tak jest w przypadku twojego wyrażeniaSageMath, (69) 62 bajty
Jednak nigdy nie wierz, że to da ci wynik, bardzo trudno jest przejść losowo przez wszystkie liczby:
jeśli nie nalegałeś na obcinanie:
SageMath, 12 bajtów, jeśli
exp
jest dozwoloneDziała dla wszystkich rzeczy: pozytywne, negatywne, zero, złożone, ...
źródło
exp
jest to dozwolone, mam mniej niż 12 lat i wcale nie jestem głupia :)exp
jest to skrót od „funkcji wykładniczej”, która jest „funkcją, której wartość jest stałą podniesioną do potęgi argumentu, szczególnie funkcją, w której stała jest równa e.”, I „Nie ma zastosowania metod / operatorów, które może podnieść liczbę do potęgi ”,exp
nie jest dozwolone.Python - 62 bajty
Ocenia pełną precyzję zmiennoprzecinkową. Zastosowana metoda jest metodą Halleya . Ponieważ każda iteracja daje 3 razy więcej poprawnych cyfr niż ostatnia, 99 iteracji to trochę przesada.
Wejście wyjście:
źródło
0
-2
, przepraszam za to.v**(1/.3)
byłby pewnym zwycięzcą.JavaScript (55)
function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}
BONUS, Ogólne sformułowanie dla wszystkich korzeni
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}
W przypadku pierwiastka sześciennego wystarczy użyć
f(n,3)
, pierwiastek kwadratowyf(n,2)
itp. Przykład:f(1024,10)
zwraca2
.Objaśnienie
Na podstawie metody Newtona:
Znajdź:
f(x) = x^3 - n = 0
rozwiązaniem jestn = x^3
Wyprowadzenie:
f'(x) = 3*x^2
Iteracja:
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2
Testy
źródło
function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
f=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
PHP - 81 bajtów
Iteracyjne rozwiązanie:
źródło
0.0001
może być zastąpiony przez1e-4
i0.00001
przez1e.5
.0/0
dajeNAN
w PHP 7).$i=0;
jest niepotrzebne (-5 bajtów. Gdyby nie było,for
zaoszczędziłby jeden bajt.) Miejsce poprint
nie jest wymagane (-1 bajt).-R
można zapisać 3 bajty za pomocą$argn
.while(1e-4+$i*$i*$i<$y=abs($x=$argn))
(-2 bajty).Perl, 92 bajty
a
zwraca ciąg znaków z liczbą bez niepotrzebnej części ułamkowej lub nieznacznych zer na prawym końcu.Wynik:
Wygenerowane przez
Obliczenia oparte są na metodzie Newtona :
źródło
APL - 31
Wykorzystuje fakt, że
cbrt(x)=e^(ln(x)/3)
zamiast naiwnego⋆
potęgowania oblicza sięe^x
za pomocą serii Taylor / Maclaurin.Przykładowe przebiegi:
Widząc odpowiedź J w 16 znakach, muszę być naprawdę okropny w APL ...
źródło
Java,
207182181Czasami, gdy gram w golfa, mam dwa piwa i gram bardzo źle
Iteracyjna metoda aproksymacji Newtona, wykonuje 99 iteracji.
Oto unGolfed:
źródło
args
zmiennej naz
mniej więcej 6 znaków. Możesz usunąć przestrzeń i nawiasy klamrowe w korpusie pętli for, zmniejszając 3 znaki. Można zastąpić10000.0
przez1e4
, zmniejszając 6 znaków. Klasa nie musi być publiczna, więc możesz zredukować więcej 7 znaków. W ten sposób zostanie zredukowany do 185 znaków.TI-Basic,
2624 bajtówźródło
^
operatora, prawda? Jest to zabronione przez zasadye^
jest pojedynczy operator w serii TI-83? Nie pamiętam Tak czy inaczej, narusza to ducha zasad.exp(ln(x)/3)
lube^(ln(x/3))
jeśli zezwolisz na którykolwiek z tych dwóch. Ale jakoś rozumiem, żeexp(ln(x)/a)
jest to zbyt ekwiwalent, abyx^(1/a)
pozwalały na to reguły: - /Js 57 bajtów
f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
źródło
JavaScript: 73/72 znaków
Ten algorytm jest kiepski i wykorzystuje fakt, że pytanie to jest ograniczone do 4 cyfr po przecinku. Jest to zmodyfikowana wersja algorytmu, którą zasugerowałem w piaskownicy w celu przerobienia pytania. Liczy się od zera do nieskończoności
h*h*h<a
, wystarczy sztuczka mnożenia i dzielenia, aby obsłużyć precyzję 4 cyfr dziesiętnych.Edytuj, 4 lata później: zgodnie z sugestią Luisa Felipe De Jesus Munoza, użycie
**
kodu jest krótsze, ale ta funkcja nie była dostępna w 2014 roku, kiedy napisałem tę odpowiedź. W każdym razie, używając go, golimy dodatkową postać:źródło
h*h*h
możesz zrobićh**3
i zapisać 1 bajt**
Operator został zaproponowany w 2015 r. I został zaakceptowany jako część ECMAScript 7 w 2016 r. W chwili, gdy to napisałem, nie było tego**
w języku.JavaScript - 157 znaków
Ta funkcja:
Wersja objaśniona bez golfa:
źródło
PHP, 61
Na podstawie metody Newtona. Nieznacznie zmodyfikowana wersja odpowiedzi Michaela :
Działa z liczbami ujemnymi, może obsługiwać liczby zmiennoprzecinkowe i zaokrągla wynik do 4 liczb po przecinku, jeśli wynikiem jest liczba zmiennoprzecinkowa.
Działające demo
źródło
for($x=1;++$i<100;)...
. Ale używanie predefiniowanych zmiennych jako danych wejściowych jest zasadniczo niezadowolone . Lepsze wykorzystanie$argv[1]
lub$argn
.Befunge 98 - Prace w toku
Ten język nie obsługuje liczb zmiennoprzecinkowych; to próbuje je naśladować. Obecnie działa dla liczb dodatnich, które nie zaczynają się
0
po przecinku (głównie). Jednak wyświetla tylko 2 miejsca po przecinku.Działa poprzez wprowadzenie części przed kropką dziesiętną, pomnożenie jej przez
100000
, a następnie wprowadzenie części po kropce i dodanie dwóch liczb razem. Druga linia robi licznik, dopóki kostka nie będzie większa niż wprowadzona liczba. Następnie trzeci wiersz wyodrębnia liczbę dziesiętną z liczby całkowitej.Jeśli ktoś może mi powiedzieć, dlaczego trzeci wiersz dzieli tylko,
100
aby uzyskać prawidłowe wartości, proszę mi powiedzieć.IO:
źródło
Smalltalk, 37
uznanie dla algorytmu dla mniip; Wersja Smalltalk jego kodu:
wejście w n; wyjście w x:
lub jako blok
źródło
GameMaker Language, 51 bajtów
źródło
Haskell: 99 ° C
Nie można pokonać sprytem @mniip. Właśnie przeszedłem wyszukiwanie binarne.
Nie golfowany:
źródło
d
(jak(l#h)x
), aby zapisać bajt dla każdego połączenia.c
wtedy staje sięid>>=(0#)
.c < x
.1>0
zamiastTrue
.J 28
Przy użyciu metody Newtona znalezienie źródła
x^3 - X
kroku aktualizacji tox - (x^3 - C)/(3*x^2)
, gdzie x oznacza bieżącą domysł, a C wejście. Wykonywanie matematyki na tym daje absurdalnie prosty wyraz(2*x+C/x^2) /3
. Należy zwrócić uwagę na liczby ujemne.Zaimplementowane w J, od prawej do lewej:
|
Weź abs obu argumentów, przekaż je dalej^:_
Czyń aż do konwergencji(%*~@])
jestC / x^2
(*~ y
jest równoważney * y
)+:@]
jest2 x
3%~
podziel przez trzy. Daje to pozytywne korzenie*@[ * positive_root
zwielokrotnia korzeń dodatni przez znak C.Testowe uruchomienie:
źródło
AWK, 53 bajty
Przykładowe użycie:
Dziękujemy na @Mig za
JavaScript
rozwiązanie, z którego pochodzi. Działa zaskakująco szybko, ponieważfor
pętla wymaga iteracji, aby przestała się zmieniać.źródło
C, 69 bajtów
Kolejna implementacja metody Newtona. Wypróbuj online!
źródło
Stax , 10 bajtów CP437
Uruchom i debuguj online!
Wyjaśnienie
Używa rozpakowanej wersji do wyjaśnienia.
źródło
Rozwiązanie JAVA
public BigDecimal cubeRoot (liczba BigDecimal) {
źródło
Rozwiązanie Python
źródło