Wyzwanie
Wyzwanie polega na napisaniu programu, który przyjmuje liczby dodatniea
oraz liczbę niezerowąb
i dane wyjściowe a^b
(podniesione do potęgi b). Możesz używać tylko + - * / abs()
jako funkcji / operatorów matematycznych. Można je stosować tylko do wartości skalarnych, ale nie do całych list lub tablic.
Przykłady:
1.234 ^ 5.678 = 3.29980
4.5 ^ 4.5 = 869.874
4.5 ^-4.5 = 0.00114959
Ważne: http://xkcd.com/217/
Detale
Możesz napisać funkcję lub podobną konstrukcję do użycia w konsoli. Jeśli nie możesz użyć danych wejściowych konsoli, możesz założyć, że obie liczby są zapisywane w zmiennych i wypisie przez standardowe wyjście lub zapis do pliku. Dane wyjściowe muszą być poprawne do co najmniej 4 cyfr znaczących. Można założyć, że oba a
i b
są niezerowe. Czas działania znacznie dłuższy niż 1 minuta jest niedopuszczalny. Wygra najmniejsza liczba bajtów. Proszę wyjaśnić swój program i algorytm.
EDYCJA: Należy brać pod uwagę tylko pozytywne zasady . Możesz założyć a>0
. Pamiętaj, że obie liczby nie muszą być liczbami całkowitymi !!!
-0.5 ** 0.5
być wynik?Odpowiedzi:
Python, 77
Podobnie jak w przypadku niektórych innych odpowiedzi, jest to oparte na log i exp. Ale funkcje są obliczane przez numeryczne rozwiązywanie równań różniczkowych zwyczajnych.
Czy spełnia wymagania? Dla przykładów w pytaniu tak. W przypadku dużych a zajmie to bardzo dużo czasu. Dla dużych a lub b stanie się niedokładny.
Przykłady:
Aktualizacja: flawr poprosił o więcej szczegółów na temat matematyki, więc proszę bardzo. Rozważyłem następujące problemy z wartością początkową:
Jeśli mogę znaleźć wartość t taką, że x (t) = a, to będę mieć y (t) = exp (bt) = a ^ b. Najprostszym sposobem numerycznego rozwiązania problemu z wartością początkową jest metoda Eulera . Obliczasz pochodną, którą funkcja ma mieć, a następnie wykonujesz krok w kierunku pochodnej i proporcjonalnie do niej, ale skalowana za pomocą małej stałej. Więc to właśnie robię, rób małe kroki, aż x będzie tak duże jak a, a następnie zobacz, jakie jest y w tym czasie. Cóż, tak o tym myślałem. W moim kodzie t nigdy nie jest jawnie obliczane (jest to 1e-7 * liczba kroków pętli while), a niektóre znaki zapisałem, wykonując obliczenia dla x za pomocą a.
źródło
JavaScript (E6) 155
174 191Edycja 2 Zgodnie z sugestią @bebe, użycie funkcji rekurencyjnej (działa gorzej, ale krócej)
Nieznacznie zmieniono funkcję R, aby uniknąć „zbyt dużej rekurencji”
Dodano zestaw testowy. Funkcja działa dobrze dla zasad <3000 i wykładnika w zakresie -50..50.
Edytuj Golfed więcej i lepszą precyzję
Dowolna liczba rzeczywista może być przybliżona liczbą wymierną (a standardowe „rzeczywiste” liczby IEEE przechowują racjonalne wartości). Dowolną liczbę wymierną można wyrazić jako ułamek a / bz liczbami całkowitymi a i b. x ^ (a / b) jest pierwiastkiem b z (x ^ a) lub (pierwiastek b z x) ^ a. Wykładanie liczb całkowitych jest dość łatwe przez podniesienie do kwadratu. Pierwiastek całkowity można aproksymować metodami numerycznymi.
Kod
Testuj w FireFox lub konsoli FireBug
źródło
e&1&&(r*=b)
robi, z wyjątkiem pomnożenier
przezb
?if(e&1 != 0) r *= b
P=(x,e)=>(F=(b,e,r=1)=>e?F(b*b,e>>1,e&1?r*b:r):r,R=(b,e,g=1,y=1e-16,d=(b/F(g,e-1)-g)/e)=>d>y|d<-y?R(b,e,g+d):g,e<0&&(x=1/x,e=-e),f=1<<24,F(R(x,f),e*f))
(muszę być zmęczony)Haskell, 85
90Standardowy algorytm exp-log. Teraz pod inną nazwą, goląc jeszcze kilka znaków:
raise
jest teraz nazywany(%)
, lub%
w notacji infiksowej, nawet jego użycie pochłania mniej bajtów:4.5%(-4.5)
Wersja bez golfa używa również tylko 172 bajtów:
źródło
JS (ES6), 103 bajty
Przykłady:
Użyj serii Taylora.
b^x = 1 + ln(b)*x/1! + (ln(b)*x)^2/2! + (ln(b)*x)^3/3! + (ln(b)*x)^4/4! + ...
z przybliżeniem logarytmu naturalnego :
ln(b) = (1-1/x) + (1-1/x)^2/2 + (1-1/x)^3/3 + (1-1/x)^4/4 + ...
Użyłem 128 iteracji do obliczeń
b^x
(więcej iteracji jest trudnych z powodu silni) i 262144 iteracji dlaln(b)
źródło
e(80,5) ->1555962210.2240903
- powinno być 3276800000golflua 120
Korzystam z tego, że
i napisałem własne
log
iexp
funkcje. Wartościa
ib
należy wprowadzić w nowych wierszach podczas uruchamiania w terminalu:Przykładowe przebiegi:
Nie golfowa wersja Lua to:
źródło