O objetivo deste desafio é usar o método de Euler para aproximar a solução de uma equação diferencial da forma f (n) (x) = c. †
A entrada será uma lista de números inteiros, em que o n th valor representa o valor de f (n) (0). O primeiro número inteiro é f (0), o segundo é f '(0) e assim por diante. O último número inteiro nesta lista é a constante e sempre permanecerá o mesmo.
Também fornecido como entrada, será um número inteiro positivo (diferente de zero) x , que representa o valor alvo (você está tentando estimar f (x)). O tamanho da etapa para o método de Euler será sempre 1. Portanto, você precisará executar x etapas no total.
Se você não é familiar com o método de Euler, aqui está um exemplo detalhado com uma explicação para a entrada [4, -5, 3, -1]
, x = 8.
x f(x) f'(x) f''(x) f'''(x)
0 4 -5 3 -1
1 4-5 = -1 -5+3 = -2 3-1 = 2 -1
2 -1-2 = -3 -2+2 = 0 2-1 = 1 -1
3 -3+0 = -3 0+1 = 1 1-1 = 0 -1
4 -3+1 = -2 1+0 = 1 0-1 = -1 -1
5 -2+1 = -1 1-1 = 0 -1-1 = -2 -1
6 -1+0 = -1 0-2 = -2 -2-1 = -3 -1
7 -1-2 = -3 -2-3 = -5 -3-1 = -4 -1
8 -3-5 = -8
Essencialmente, cada célula na tabela gerada é a soma da célula acima dela e da célula acima e à direita. Então, f (a) = f (a-1) + f '(a-1); f '(a) = f' (a-1) + f '' (a-1); e f '' (a) = f '' (a-1) + f '' '(a-1). A resposta final é f (8) ≈ -8. ††
A lista de entrada sempre conterá 2 ou mais elementos, todos com valores absolutos menores que 10. x ≥ 1 também é garantido. A saída é um único inteiro, a aproximação de f (x). A entrada pode ser obtida em qualquer ordem (a lista antes de x ou x antes da lista). x também pode ser o primeiro ou o último elemento da lista, se desejado.
Casos de teste:
[4, -5, 3, -1], x = 8 => -8
[1, 2, 3, 4, 5, 6], x = 10 => 3198
[1, 3, 3, 7], x = 20 => 8611
[-3, 3, -3, 3, -3, 3, -3, 3, -3], x = 15 => -9009
[1, 1], x = 1 => 2
†: é notável que o uso de um método de aproximação nessa situação seja, de fato, estúpido. no entanto, a função mais simples possível foi escolhida para os propósitos deste desafio.
††: o valor real passa a ser -25⅓, o que qualificaria essa aproximação como "não muito boa".
fonte
Respostas:
Haskell , 38 bytes
Experimente online!
Aprimorado de 39 bytes:
Expressa recursivamente a saída
l%n
. Mover para cima corresponde a decrementarn
e mover para a direita corresponde a tirartail l
para deslocar todos os elementos da lista um espaço à esquerda. Portanto, a saídal%n
é o valor acimal%(n-1)
, mais o valor acima e à direita(tail l)%(n-1)
O caso base
n==0
é pegar o primeiro elemento da lista.Idealmente, a entrada seria preenchida com infinitos zeros à direita, uma vez que as derivadas de um polinômio acabam se tornando zero. Simulamos isso anexando a
0
quando pegamos otail
.Alt 41 estranho:
fonte
MATL , 9 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Gelatina ,
65 bytesExperimente online!
-1 byte graças a @Doorknob
Explicação
fonte
Braquilog ,
1312 bytesExperimente online!
Como funciona
Solução anterior de 13 bytes
Experimente online!
Como funciona
fonte
Mathematica, 32 bytes
fonte
Python ,
8058 bytesAme a matemática para este desafio.
Como funciona (funciona apenas com python 2):
Experimente online!
Alternativa de 100 bytes com o uso do triângulo pascal
Como funciona (funciona para python 2 e 3):
Essa fórmula funciona mapeando os coeficientes da linha
x
do triângulo pascal na matriz. Cada elemento do triângulo pascal é determinado pela função de escolha da linha e do índice. A soma dessa nova matriz é equivalente à saída emx
. Também é intuitivo, pois o processo iterado do método newtons (mostrado no exemplo) atua exatamente como a construção do triângulo pascal.Experimente online!
Muito obrigado aos ovs por reduzir 22 bytes convertendo o loop em uma função recursiva
fonte
Haskell,
5245 bytesExemplo de uso:
[-3,3,-3,3,-3,3,-3,3,-3] # 15
->-9009
. Experimente online!Como funciona
Edit: @xnor salvou 7 bytes. Obrigado!
fonte
zipWith(+)=<<tail.(++[0])
, ou seja, conserte a lista antes e depois.=<<
aqui, isso é loucura :)=<<
é utilizado em contexto função e é definida como:(=<<) f g x = f (g x) x
. Aqui usamos=<<
infix:(f =<< g) x
withf = zipWith(+)
eg = tail
, que se traduz emzipWith(+) (tail x) x
.CJam , 12 bytes
Experimente online!
Explicação
O código implementa diretamente o procedimento descrito no desafio.
fonte
Pitão , 10 bytes
Suíte de teste.
Como funciona
fonte
APL (Dyalog) , 29 bytes
Experimente online!
Este é um dfn recursivo, mas acaba sendo muito detalhado. Golfe em andamento ...
fonte
Na verdade , 7 bytes
Experimente online!
Como funciona
fonte
Oitava , 42 bytes
Isso define uma função anônima. Experimente online!
Explicação
A solução pode ser calculada através da convocação repetida da matriz de entrada e das matrizes resultantes
[1, 1]
. Mas convolver duas ou três vezes, ou ... com[1, 1]
corresponde a convolver uma vez com[1, 2 ,1]
, ou[1, 3, 3, 1]
, ou ...; isto é, com uma linha do triângulo Pascal. Isto é obtido como a anti-diagonal da matriz de ordem Pascalx+1
.fonte
JavaScript (ES6), 41 bytes
Porto da excelente resposta Haskell do @ xnor. Solução anterior de 47 bytes.
fonte
Python 3 com Numpy , 82 bytes
Semelhante à minha resposta MATL , mas usando convolução em tamanho real, e, portanto, o resultado é a
x
-a entrada da matriz final.Experimente online!
fonte
Python , 51 bytes
Experimente online!
Esta é uma porta da minha resposta Haskell .
fonte