fundo
Pode-se mostrar que, para qualquer número inteiro k >= 0
, f(k) = tan(atan(0) + atan(1) + atan(2) + ... + atan(k))
é um número racional.
Objetivo
Escreva um programa ou função completa que, quando fornecida k >= 0
, produz f(k)
uma única fração reduzida (o numerador e o denominador são coprime).
Casos de teste
Os primeiros valores são
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)
Regras
- As brechas padrão são proibidas.
- A entrada e a saída podem estar em qualquer formato conveniente. Você pode produzir
f(k)
como uma stringnumerator/denominator
, como uma tupla de dois inteiros, uma fração ou objeto racional, etc. Se você produzir uma string, forneça apenas dois inteiros, ou seja, em3/2
vez de1 1/2
. - Isso é código-golfe, a resposta mais curta (em bytes) vence.
atan(0)
termo é desnecessário.Respostas:
M , 11 bytes
Experimente online!
Usa a fórmula OEIS
x(n) = (x(n-1)+n)/(1-n*x(n-1))
comx(0) = 0
.fonte
Mathematica, 28 bytes
Experimente online!
Uma abordagem mais longa, mas mais interessante (32 bytes):
Experimente online!
fonte
o'_'o
Mathematica e seus built-inso'_'o
Python 2 ,
7672 bytesUse a identidade:
Nós temos:
Experimente online!
Graças a Luis Mendo, economize 4 bytes.
fonte
APL (Dyalog) , 14 bytes
Requer
⎕FR←1287
( 128 bits M ponto-loating R ePresentation) para entrada pequeno. Tomak
como argumento certo.Experimente online!
⍳
números inteiros de um ak
zero (zero não é necessário, pois 0 = arctan 0)¯3+.○
soma das tangentes do arco3○
tangente1(
…)
Aplique a seguinte função tácita com 1 como argumento à esquerda e acima como argumento à direita:∧
o menor múltiplo comum (de 1 e o argumento correto); dá ao numerador÷
dividido por,
a concatenação (de 1 e o argumento correto); dá o numerador e o denominadorfonte
Haskell , 52 bytes
Isso usa a expansão da série OEIS:
Experimente online!
Ou uma versão sem pontos:
fonte
JavaScript (ES6), 80 bytes
Retorna um par [numerador, denominador]. Explicação: Deixe
f(n-1) = a/b
entãof(n) = atan(tan(n)+tan(a/b)) = (n+a/b)/(1-n*a/b) = (b*n+a)/(b-n*a)
. Resta então reduzir a fração aos seus termos mais baixos.Ambiente on-line ES6
fonte
Pari / GP , 36 bytes
Experimente online!
Ou o mesmo comprimento:
Experimente online!
fonte
05AB1E ,
3326 bytesExperimente online!
Explicação
fonte
Oitava , 30 bytes
Experimente online!
fonte
Casio-Basic, 35 bytes
tan -1 deve ser inserido como o do teclado Trig; ou o -1 pode ser inserido separadamente no teclado abc> Math. De acordo com o manual da fx-CP400, é um caractere único de dois bytes (764).
Função, 34 bytes para o código, +1 byte para adicionar
k
como argumento.Explicação
seq(tan-1(n),n,0,k)
gera todos os valorestan-1(n)
de 0 a k.sum
os adiciona todos juntos e, em seguidatan
, a função tangente neles.tExpand
irá transformá-los em uma única fração.fonte
⁻
e¹
tem dois bytes cada;E5CC
eE5C1
.Julia 0.6.0 40 bytes
k->rationalize(tan(sum(x->atan(x),1:k)))
É uma implementação direta da questão. Às vezes, a precisão da racionalização pode ser estranha, mas funciona bem 99% do tempo.
fonte