Ziel dieser Herausforderung ist es, mit der Euler-Methode die Lösung einer Differentialgleichung der Form f (n) (x) = c zu approximieren . †
Die Eingabe ist eine Liste von ganzen Zahlen, in denen der n- te Wert den Wert von f (n) (0) darstellt. Die erste ganze Zahl ist f (0), die zweite ist f '(0) und so weiter. Die letzte Ganzzahl in dieser Liste ist die Konstante und bleibt immer gleich.
Als Eingabe wird auch eine positive Ganzzahl x (ungleich Null) bereitgestellt , die den Zielwert darstellt (Sie versuchen, f (x) zu schätzen). Die Schrittgröße für die Euler-Methode ist immer 1. Daher müssen Sie insgesamt x Schritte ausführen.
Wenn Sie mit der Euler-Methode nicht vertraut sind, finden Sie hier ein detailliertes Beispiel mit einer Erklärung für die Eingabe [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
Im Wesentlichen ist jede Zelle in der generierten Tabelle die Summe der Zelle darüber und der Zelle darüber und rechts. Also ist f (a) = f (a-1) + f '(a-1); f '(a) = f' (a-1) + f '' (a-1); und f '' (a) = f '' (a-1) + f '' '(a-1). Die endgültige Antwort lautet f (8) ≈ -8. ††
Die Eingabeliste enthält immer 2 oder mehr Elemente, die alle absolute Werte unter 10 haben. X ≥ 1 ist ebenfalls garantiert. Die Ausgabe ist eine einzelne ganze Zahl, die Approximation von f (x). Die Eingabe kann in beliebiger Reihenfolge erfolgen (die Liste vor x oder x vor der Liste). Falls gewünscht, kann x auch das erste oder letzte Element der Liste sein.
Testfälle:
[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
†: Es ist bemerkenswert, dass die Verwendung einer Approximationsmethode in dieser Situation tatsächlich dumm ist. Für diese Herausforderung wurde jedoch die einfachstmögliche Funktion gewählt.
††: Der tatsächliche Wert ist zufällig -25⅓, was diese Annäherung als "nicht sehr gut" qualifizieren würde.
quelle
Antworten:
Haskell , 38 Bytes
Probieren Sie es online aus!
Verbessert von 39 Bytes:
Drückt die Ausgabe rekursiv aus
l%n
. Das Verschieben nach oben entspricht dem Dekrementierenn
, und das Verschieben nach rechts entsprichttail l
dem Verschieben aller Listenelemente um ein Leerzeichen nach links. Die Ausgabel%n
ist also der Wert obenl%(n-1)
plus der Wert oben und rechts(tail l)%(n-1)
Der Basisfall
n==0
ist das erste Listenelement.Im Idealfall wird die Eingabe mit unendlich vielen Nullen rechts aufgefüllt, da die Ableitungen eines Polynoms schließlich Null werden. Wir simulieren dies, indem
0
wir ein anhängen, wenn wir das nehmentail
.Weird alt 41:
quelle
MATL , 9 Bytes
Probieren Sie es online aus! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Gelee ,
65 BytesProbieren Sie es online aus!
-1 Byte dank @Doorknob
Erläuterung
quelle
Brachylog ,
1312 BytesProbieren Sie es online aus!
Wie es funktioniert
Vorherige 13-Byte-Lösung
Probieren Sie es online aus!
Wie es funktioniert
quelle
Mathematica, 32 Bytes
quelle
Python ,
8058 BytesIch liebe die Mathematik für diese Herausforderung.
Wie es funktioniert (funktioniert nur mit Python 2):
Probieren Sie es online aus!
100 Byte wechseln sich mit der Verwendung eines Pascal-Dreiecks ab
Wie es funktioniert (funktioniert für Python 2 und 3):
Diese Formel funktioniert durch Abbildung der Koeffizienten
x
der Pascal-Dreiecksreihe auf das Array. Jedes Element des Pascal-Dreiecks wird durch die Auswahlfunktion der Zeile und des Index bestimmt. Die Summe dieses neuen Arrays entspricht der Ausgabe beix
. Es ist auch intuitiv, da der iterierte Prozess der Newton-Methode (im Beispiel gezeigt) genau wie die Konstruktion des Pascal-Dreiecks wirkt.Probieren Sie es online aus!
Ein großes Dankeschön an ovs für die Reduzierung von 22 Bytes durch Umwandlung der Schleife in eine rekursive Funktion
quelle
Haskell,
5245 BytesAnwendungsbeispiel:
[-3,3,-3,3,-3,3,-3,3,-3] # 15
->-9009
. Probieren Sie es online aus!Wie es funktioniert
Bearbeiten: @xnor hat 7 Bytes gespeichert. Vielen Dank!
quelle
zipWith(+)=<<tail.(++[0])
, dh die Liste vorher und nicht danach reparieren.=<<
hier=<<
wird im Funktionskontext verwendet und ist definiert als :(=<<) f g x = f (g x) x
. Hier verwenden wir das=<<
Infix:(f =<< g) x
mitf = zipWith(+)
undg = tail
, was übersetzt bedeutetzipWith(+) (tail x) x
.CJam , 12 Bytes
Probieren Sie es online aus!
Erläuterung
Der Code implementiert direkt die in der Herausforderung beschriebene Prozedur.
quelle
Pyth , 10 Bytes
Testsuite.
Wie es funktioniert
quelle
APL (Dyalog) , 29 Bytes
Probieren Sie es online aus!
Dies ist eine rekursive dfn, aber es stellt sich als zu ausführlich heraus. Golfen im Gange ...
quelle
Eigentlich 7 Bytes
Probieren Sie es online aus!
Wie es funktioniert
quelle
Oktave , 42 Bytes
Dies definiert eine anonyme Funktion. Probieren Sie es online aus!
Erläuterung
Die Lösung könnte berechnet werden, indem das Eingabearray und die resultierenden Arrays wiederholt mit gefaltet werden
[1, 1]
. Aber zweimal oder dreimal[1, 1]
zu falten oder ... mit entspricht einer einmaligen Faltung mit[1, 2 ,1]
oder[1, 3, 3, 1]
oder oder; das heißt, mit einer Reihe des Pascal-Dreiecks. Dies wird als Antidiagonale der Pascal-Ordnungsmatrix erhaltenx+1
.quelle
JavaScript (ES6), 41 Byte
Port of @ xnors ausgezeichnete Haskell-Antwort. Vorherige 47-Byte-Lösung.
quelle
Python 3 mit Numpy , 82 Bytes
Ähnlich wie bei mir MATL-Antwort , jedoch mit Faltung in voller Größe, und daher ist das Ergebnis der
x
-te Eintrag des endgültigen Arrays.Probieren Sie es online aus!
quelle
Python , 51 Bytes
Probieren Sie es online aus!
Dies ist ein Port meiner Haskell-Antwort .
quelle