Le but de ce défi est d'utiliser la méthode d' Euler pour approximer la solution d'une équation différentielle de la forme f (n) (x) = c. †
L'entrée sera une liste d'entiers dans laquelle la n ème valeur représente la valeur de f (n) (0). Le premier entier est f (0), le second est f '(0), et ainsi de suite. Le dernier entier de cette liste est la constante et restera toujours le même.
Un nombre entier positif (non nul) x , qui représente la valeur cible (vous essayez d'estimer f (x)), est également fourni en entrée . La taille du pas pour la méthode d'Euler sera toujours 1. Ainsi, vous devrez effectuer x pas au total.
Si vous n'êtes pas familier avec la méthode d'Euler, voici un exemple détaillé avec une explication pour l'entrée [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
Essentiellement, chaque cellule du tableau généré est la somme de la cellule au-dessus et de la cellule au-dessus et à droite. Donc, f (a) = f (a-1) + f '(a-1); f '(a) = f' (a-1) + f '' (a-1); et f '' (a) = f '' (a-1) + f '' '(a-1). La réponse finale est f (8) ≈ -8. ††
La liste d'entrée contiendra toujours 2 éléments ou plus, qui auront tous des valeurs absolues inférieures à 10. x ≥ 1 est également garanti. La sortie est un entier unique, l'approximation de f (x). L'entrée peut être prise dans l'un ou l'autre ordre (la liste avant x ou x avant la liste). x peut également être le premier ou le dernier élément de la liste, si vous le souhaitez.
Cas de test:
[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
†: il est à noter que l'utilisation d'une méthode d'approximation dans cette situation est, en fait, stupide. cependant, la fonction la plus simple possible a été choisie aux fins de ce défi.
††: la valeur réelle se situe à -25⅓, ce qui qualifierait cette approximation de "pas très bonne".
la source
Réponses:
Haskell , 38 octets
Essayez-le en ligne!
Amélioré de 39 octets:
Exprime récursivement la sortie
l%n
. Monter correspond à décrémentern
, et déplacer à droite correspond à prendretail l
pour décaler tous les éléments de la liste d'un espace vers la gauche. Ainsi, la sortiel%n
est la valeur cil%(n-1)
- dessus , plus la valeur au-dessus et à droite(tail l)%(n-1)
Le cas de base
n==0
est de prendre le premier élément de la liste.Idéalement, l'entrée serait complétée par une infinité de zéros vers la droite, car les dérivées d'un polynôme finissent par devenir nulles. Nous simulons cela en ajoutant un
0
lorsque nous prenons letail
.Bizarre alt 41:
la source
MATL , 9 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Gelée ,
65 octetsEssayez-le en ligne!
-1 octet grâce à @Doorknob
Explication
la source
Brachylog ,
1312 octetsEssayez-le en ligne!
Comment ça fonctionne
Solution précédente de 13 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Mathematica, 32 octets
la source
Python ,
8058 octetsJ'adore les mathématiques pour ce défi.
Comment ça marche (ne fonctionne qu'avec python 2):
Essayez-le en ligne!
100 octets alternés avec utilisation du triangle pascals
Comment ça marche (fonctionne pour python 2 et 3):
Cette formule fonctionne en mappant les coefficients de la rangée
x
de triangle pascals sur le tableau. Chaque élément du triangle pascal est déterminé par la fonction de choix de la ligne et de l'index. La somme de ce nouveau tableau est équivalente à la sortie dex
. Il est également intuitif car le processus itéré de la méthode newtons (illustré dans l'exemple) agit exactement comme la construction d'un triangle pascal.Essayez-le en ligne!
Un grand merci aux ovs pour avoir réduit 22 octets en convertissant la boucle en une fonction récursive
la source
Haskell,
5245 octetsExemple d'utilisation:
[-3,3,-3,3,-3,3,-3,3,-3] # 15
->-9009
. Essayez-le en ligne!Comment ça fonctionne
Modifier: @xnor a enregistré 7 octets. Merci!
la source
zipWith(+)=<<tail.(++[0])
, c'est-à-dire fixer la liste avant plutôt qu'après.=<<
ici, c'est fou :)=<<
est utilisé dans le contexte de la fonction et est définie comme suit:(=<<) f g x = f (g x) x
. Ici, nous utilisons=<<
infix:(f =<< g) x
avecf = zipWith(+)
etg = tail
, ce qui se traduit parzipWith(+) (tail x) x
.CJam , 12 octets
Essayez-le en ligne!
Explication
Le code implémente directement la procédure décrite dans le challenge.
la source
Pyth , 10 octets
Suite de tests.
Comment ça fonctionne
la source
APL (Dyalog) , 29 octets
Essayez-le en ligne!
Il s'agit d'un dfn récursif, mais il s'avère trop verbeux. Golf en cours ...
la source
En fait , 7 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Octave , 42 octets
Cela définit une fonction anonyme. Essayez-le en ligne!
Explication
La solution pourrait être calculée en convoluant à plusieurs reprises le tableau d'entrée et les tableaux résultants avec
[1, 1]
. Mais convoluer deux fois, ou trois fois, ou ... avec[1, 1]
correspond à convoluer une fois avec[1, 2 ,1]
, ou[1, 3, 3, 1]
, ou ...; c'est-à-dire avec une rangée du triangle Pascal. Ceci est obtenu comme l'anti-diagonale de la matrice d'ordre Pascalx+1
.la source
JavaScript (ES6), 41 octets
Port de @ xnor excellente réponse Haskell. Solution précédente de 47 octets.
la source
Python 3 avec Numpy , 82 octets
Semblable à ma réponse MATL , mais en utilisant une convolution pleine taille, et donc le résultat est la
x
-ème entrée du tableau final.Essayez-le en ligne!
la source
Python , 51 octets
Essayez-le en ligne!
Ceci est un port de ma réponse Haskell .
la source