Mój szef właśnie powiedział mi, żebym napisał funkcję cosinus. Będąc dobrym maniakiem matematyki, mój umysł natychmiast wyczarował odpowiedni serial Taylora.
cos(x) = 1 / 0! - x^2 / 2! + x^4 / 4! - x^6 / 6! + ... + (-1)^k x^(2k) / (2k)! + ...
Jednak mój szef jest bardzo wybredny. Chciałby móc dokładnie określić, ile terminów z serii Taylor należy obliczyć. Czy możesz mi pomóc napisać tę funkcję?
Twoje zadanie
Biorąc pod uwagę zmiennoprzecinkową wartość x
od 0
do 2 pi
i dodatnią liczbę całkowitą n
mniejszą niż 100
, oblicz sumę pierwszych n
składników szeregu Taylora podanych powyżej dla cos(x)
.
To jest golf golfowy , więc wygrywa najkrótszy kod. Dane wejściowe i wyjściowe można pobierać na dowolny ze standardowych sposobów. Standardowe luki są zabronione.
Uwagi
- Dane wejściowe można przyjmować w dowolnej rozsądnej formie, o ile istnieje wyraźny rozdział między
x
in
. - Dane wejściowe i wyjściowe powinny być wartościami zmiennoprzecinkowymi, co najmniej tak dokładnymi jak obliczanie formuły przy użyciu liczb zmiennoprzecinkowych IEEE o pojedynczej precyzji z pewnymi standardowymi regułami zaokrąglania.
- Jeśli ma to sens dla używanego języka, obliczenia mogą być wykonywane przy użyciu dokładnych wielkości wymiernych, ale dane wejściowe i wyjściowe powinny być nadal w postaci dziesiętnej.
Przykłady
x | n | Output
----+----+--------------
0.0 | 1 | 1.0
0.5 | 1 | 1.0
0.5 | 2 | 0.875
0.5 | 4 | 0.87758246...
0.5 | 9 | 0.87758256...
2.0 | 2 | -1.0
2.0 | 5 | -0.4158730...
code-golf
math
trigonometry
calculus
Silvio Mayolo
źródło
źródło
n
to też jest większe niż0
?Odpowiedzi:
Operacyjny język skryptowy Flashpoint ,
165157 bajtówZadzwoń z:
Wydajność:
Jestem całkiem pewien, że liczby są liczbami zmiennoprzecinkowymi IEEE o pojedynczej precyzji, nawet jeśli na wydruku dłuższe miejsca dziesiętne nie są tak dokładne. To druk zaokrągla liczby w ten sposób, w rzeczywistości liczby są dokładniejsze.
Na przykład
a=1.00001;b=1.000011;hint format["%1\n%2\n%3", a, b, a==b]
wyświetli to:Tak więc wyraźnie rzeczywista dokładność liczb jest większa niż precyzja drukowana.
źródło
dir=-1;num=1;player addEventHandler ["fired", {_dir=getdir (nearestObject [_this select 0, _this select 4]);if (dir < 0) then {dir = _dir} else {if (abs(dir - _dir) < 5) then {num = num + 1} else {hint format["%1", [dir*(pi/180), num] call F];dir=-1;num=1}}}]
- Strzelanie w określonym kierunku zwiększa licznik, a następnie strzelanie w innym kierunku wywołuje funkcję cosinus z wcześniejszym kierunkiem i liczbą strzałów w tym kierunku.05AB1E ,
1411 bajtówWypróbuj online!
Wyjaśnienie
źródło
²
, że dziwny robak dotknął go , ale zamiast tego można go zastąpićI
.MATL , 14 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Objaśnienie z przykładem
Wszystkie liczby mają podwójną precyzję (jest to ustawienie domyślne).
Rozważmy wejść
x = 2.0
,n = 5
.źródło
Mathematica,
49413931 bajtówStara, bardziej „zabawna” wersja: (39 bajtów)
Zaoszczędź 10 bajtów dzięki @Pavel i 8 dzięki @Greg Martin!
źródło
Series
możliwości Mathematiki są naprawdę niesamowite i zabawne, okazuje się, że ręczne wdrażanieSum[(-#^2)^k/(2k)!,{k,0,#2-1}]&
jest tutaj krótsze.Galaretka ,
1211 bajtówWypróbuj online!
W jaki sposób?
źródło
Galaretka, 22 bajty
Jest to pełny program, który przyjmuje n jako pierwszy argument, a x jako drugi.
Wyjaśnienie:
źródło
Python, 54 bajty
Jeśli używasz Python 2, pamiętaj, aby przekazać x jako liczbę zmiennoprzecinkową, a nie liczbę całkowitą, ale rozumiem, że nie ma znaczenia, czy używasz Python 3.
źródło
TI-Basic,
4140 bajtów1E-49
jest dodawany do kąta, ponieważ TI-Basic generuje błąd dla 0 ^ 0, jest wystarczająco duży, aby nie powodować błędu, i nie jest wystarczająco duży, aby zmienić odpowiedź.źródło
C, 96 bajtów
Recursive Live
Szczegółowy
Progresywny rekurencyjny, 133 bajty na żywo
Szczegółowy
źródło
c(0.5, 80)
=> NaN, za przepełnienief(80)=0
n<100
więc przynajmniej nie zajdziesz tak daleko w zasięgu. Nie przepełnienie stosun<100
i używaszO(2^n)
rozwiązania, myślę, że jest w porządku, o ile w końcu retuanuje wynikJavaScript (ES6), 46 bajtów
Pobiera curry wejściowe (x) (n).
źródło
C, 71 bajtów
używając schematu Hornera
Wersja bez golfa:
źródło
R
70 70bajtówzapisano 6 bajtów dzięki odpowiedzi pizzapants184 na lewę (-x ^ 2) ^ y
65 bajtów:
właściwie naiwna realizacja tego, ale trochę golfa; zwraca anonimową funkcję, która oblicza szereg Taylora do podanego n
init
musi być ustawiony na 0gamma(n+1)
zamiastfactorial(n)
1:n-1
jest równa0:(n-1)
źródło
ok , 38 bajtów
Działa to również w k , ale zajmuje 39 bajtów, ponieważ jeden
'
musi być napisany w ten sposób/:
(przynajmniej w kmac 2016.06.28 to robi).Wyjaśnienie:
Zacznijmy od środkowego kawałka.
(*/y#x)
jest potęgowaniem, jest równoważne zx^y
.*/1+!y
byłobyy!
luby
silnia.%
to podział. Dlatego funkcja pośrodku tomiddle(x,y) = (x^y)/(y!)
.Teraz bit po prawej stronie, do którego stosuje się powyższą funkcję.
2*!y
jest{0, 2, 4, ..., 2*(y-1)}
.x,'
dołączax
do każdego elementu na liście, zamieniając go w{(x, 0), (x, 2), (x, 4), ..., (x, 2*(y-1))}
. To.'
odnosi sięmiddle
do każdej pary liczb (map
zasadniczo).Na koniec
(y#1 -1)*
mnoży wynik przez 1 lub -1 (naprzemiennie) i+/
pobiera sumę.źródło
Haskell, 71 bajtów
To dość nudna odpowiedź, która nie jest zbyt trudna do rozszyfrowania. Ale
fromIntegral
naprawdę gryzie. (/
Operator wymaga operandów tego samego typu liczbowego w języku Haskell, a wymuszanie między typami liczbowymi jest niedozwolone bez trudnej funkcji.)źródło
f x n=sum[(-1)^i*x^(2*i)/fromIntegral(product[1..2*i])|i<-[0..n-1]]
Galaretka , 12 bajtów
Wypróbuj online!
Jak to działa
źródło
Pyth, 16 bajtów
Akceptuje
n
najpierwx
. Przykładowy przebieg.źródło
Haskell , 61 bajtów
Wydawało się, że różni się to od innych rozwiązań Haskell, aby uzasadnić osobną odpowiedź. Wdrożenie powinno być dość oczywiste - zadzwoń,
x#n
gdziex
jest liczbą, której cosinus ma być obliczony, in
jest to kolejność częściowej sumy, którą należy pobrać.źródło
fromIntegral
i używając**
zamiast^
, takich jak tenx#n=sum[(-x*x)**i/product[1..2*i]|i<-[0..n-1]]
oszczędza jeszcze 3 bajty.Pyt ,
373433 bajtówźródło
J,
2624 bajtów-2 bajty dzięki @cole
Początkowo planowałem użyć cyklicznego gerunda do przełączania między dodawaniem a odejmowaniem, ale nie mogłem go uruchomić.
Wyjaśnienie:
źródło
+/@:(!@]%~^*_1^2%~])2*i.
Zbadam cyklicznego gerunda: prawdopodobnie nie udał się, ponieważ J ocenia od/
prawej do lewej, więc musisz go użyć|.
(a może to zrobiłeś i nadal miałeś trudności).Perl 6 , 53 bajtów
Wypróbuj online!
To faktycznie oblicza złożoną wartość wykładniczą e iθ dla dwukrotności żądanych terminów, a następnie bierze rzeczywistą część.
źródło
MATLAB z Symbolic Math Toolbox, 57 bajtów
Ta funkcja definiuje anonimową z tym bierze
double
wejściowex
,n
i wysyła wynik postacidouble
.Przykład (testowany na R2015b):
źródło
JavaScript ES7 60 bajtów
Aby go użyć:
Naciśnij klawisz F12, wpisz funkcję, a następnie zrób
źródło
C
144130 bajtówWersja bez golfa:
Dzięki Kevin za uratowanie niektórych bajtów!
źródło
F(m){...}f(x,n)float x;{...}
while(m)u*=m--
albou=m;while(--m)u*=m
(tej samej długości)i<=n-1
jest taki sam jaki<n
Tcl , 126 bajtów
Wypróbuj online!
źródło
Stax , 12 bajtów
Uruchom i debuguj
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Uruchom ten
źródło
JavaScript, 59 bajtów
Wypróbuj online!
źródło
PHP, 76 bajtów
pobiera
X
iN
z argumentów wiersza poleceń; biegać z-r
.Pętla
$i
ze0
sięN*2-1
, zawieszonefac($i)
w$f
; jeśli$i
jest parzysty, dodaj termin do sumy$s
. wydrukuj sumę.Chciałbym mieć liczby zespolone (z
M_I
jednostką urojoną);Chciałbym po prostu pomnożyć
$f
zM_I*++$i
zaoszczędzisz 7 bajtów.Może Mathematica może to zrobić. Ale Mathematica nie musi.
I mógłby uratować dwa bajty z
cos(M_PI*$i/2)
zamiast$i&1?:
a(-1)**$k++
;ale używanie wbudowanego cosinusa do zbudowania funkcji cosinusa byłoby trochę dziwne.
źródło
Aksjomat, 36 bajtów
Zbuduj nieskończoną (w sensie skończoną, ale można poprosić o zbudowanie listy 2 * n elementów, jeśli komputer ma wystarczającą ilość pamięci) listę częściowych sum dla szeregu Taylora dla cos (x) oblicz w „a”, w „eval ( Taylor (cos (x)), a) "; pobiera element 2 * n z tej listy w „. (2 * n)”. Przypadki testowe:
źródło
J , 17 bajtów
Wypróbuj online!
Używa wbudowanego , co, jak zakładam, jest OK.
Niestety, tak naprawdę nie wiem, jak dobrze pracować z funkcjami, które pobierają argumenty za pomocą curry w ten sposób, więc musiałem to zrobić jawnie. Jestem pewien, że istnieje sposób, aby zrobić to milcząco lub krócej.
źródło
Czysty , 77 bajtów
Wypróbuj online!
źródło