tło
Można wykazać, że dla dowolnej liczby całkowitej k >= 0
, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))
jest liczbą wymierną.
Cel
Napisz kompletny program lub funkcję, która, jeśli zostanie podana k >= 0
, wyprowadza f(k)
jako pojedynczy ułamek zredukowany (licznik i mianownik są pierwszymi liczbami).
Przypadki testowe
Pierwsze kilka wartości to
f(0) = (0,1)
f(1) = (1,1)
f(2) = (-3,1)
f(3) = (0,1)
f(4) = (4,1)
f(5) = (-9,19)
f(6) = (105,73)
Zasady
- Standardowe luki są zabronione.
- Dane wejściowe i wyjściowe mogą być w dowolnym dogodnym formacie. Możesz wyprowadzać dane
f(k)
jako ciąg znakównumerator/denominator
, jako krotkę dwóch liczb całkowitych, ułamek zwykły lub obiekt wymierny itp. Jeśli wyprowadzasz ciąg znaków, podaj tylko dwie liczby całkowite, to znaczy dane wyjściowe3/2
zamiast1 1/2
. - To jest golf golfowy, wygrywa najkrótsza odpowiedź (w bajtach).
atan(0)
Określenie nie jest konieczne.Odpowiedzi:
M , 11 bajtów
Wypróbuj online!
Używa formuły OEIS
x(n) = (x(n-1)+n)/(1-n*x(n-1))
zx(0) = 0
.źródło
Mathematica, 28 bajtów
Wypróbuj online!
Dłuższe, ale bardziej interesujące podejście (32 bajty):
Wypróbuj online!
źródło
o'_'o
Mathematica i jej wbudowaneo'_'o
Python 2 ,
7672 bajtyUżyj tożsamości:
Mamy:
Wypróbuj online!
Dzięki Luis Mendo zaoszczędź 4 bajty.
źródło
APL (Dyalog) , 14 bajtów
Wymaga
⎕FR←1287
( 128- bitowej reprezentacji F punktu reprezentacji R ) dla małych danych wejściowych. Uważa sięk
za słuszny argument.Wypróbuj online!
⍳
liczby całkowite od jednego do drugiegok
zera (zero nie jest potrzebne, ponieważ 0 = arctan 0)¯3+.○
suma stycznych arcus3○
tangens1(
…)
Zastosuj następującą ukrytą funkcję z 1 jako lewym argumentem i powyższym jako prawym argumentem:∧
najniższa wspólna wielokrotność (1 i odpowiedni argument); podaje licznik÷
podzielony przez,
konkatenacja (1 i właściwego argumentu); podaje licznik i mianownikźródło
Haskell , 52 bajty
Wykorzystuje to rozszerzenie serii OEIS:
Wypróbuj online!
Lub wersja bez punktów:
źródło
JavaScript (ES6), 80 bajtów
Zwraca parę [licznik, mianownik]. Objaśnienie: Niech
f(n-1) = a/b
więcf(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a)
. Następnie pozostaje zredukować ułamek do najniższych wartości.Online ES6 Environment
źródło
Pari / GP , 36 bajtów
Wypróbuj online!
Lub tej samej długości:
Wypróbuj online!
źródło
05AB1E ,
3326 bajtówWypróbuj online!
Wyjaśnienie
źródło
Oktawa , 30 bajtów
Wypróbuj online!
źródło
Casio-Basic, 35 bajtów
tan -1 należy wpisać jako ten na klawiaturze Trig; lub -1 można wprowadzić oddzielnie od klawiatury abc> Math. Zgodnie z instrukcją fx-CP400 jest to pojedynczy dwubajtowy znak (764).
Funkcja, 34 bajty na kod, +1 bajt do dodania
k
jako argument.Wyjaśnienie
seq(tan-1(n),n,0,k)
generuje wszystkie wartościtan-1(n)
od 0 do k.sum
dodaje je wszystkie razem, a następnietan
wykonuje na nich funkcję styczną.tExpand
zamieni je następnie w jedną frakcję.źródło
⁻
i¹
są dwa bajty każda;E5CC
aE5C1
.Julia 0.6.0 40 bajtów
k->rationalize(tan(sum(x->atan(x),1:k)))
To prosta implementacja pytania. Precyzja racjonalizacji może czasem być dziwna, ale działa dobrze przez 99% czasu.
źródło