Tujuan dari tantangan ini adalah menggunakan metode Euler untuk memperkirakan solusi dari persamaan diferensial dari bentuk f (n) (x) = c. †
Input akan menjadi daftar bilangan bulat di mana nilai n mewakili nilai f (n) (0). Bilangan bulat pertama adalah f (0), yang kedua adalah f '(0), dan seterusnya. Bilangan bulat terakhir dalam daftar ini adalah konstan dan akan selalu tetap sama.
Juga disediakan sebagai masukan akan menjadi positif (nol) bilangan bulat x , yang mewakili nilai target (Anda mencoba untuk memperkirakan f (x)). Ukuran langkah untuk metode Euler akan selalu 1. Dengan demikian, Anda harus mengambil x langkah total.
Jika Anda tidak terbiasa dengan metode Euler, berikut adalah contoh terperinci dengan penjelasan untuk input [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
Pada dasarnya, setiap sel dalam tabel yang dihasilkan adalah jumlah sel di atasnya dan sel di atas dan ke kanan. Jadi, f (a) = f (a-1) + f '(a-1); f '(a) = f' (a-1) + f '' (a-1); dan f '' (a) = f '' (a-1) + f '' '(a-1). Jawaban akhir adalah f (8) ≈ -8. ††
Daftar input akan selalu mengandung 2 atau lebih elemen, yang semuanya akan memiliki nilai absolut kurang dari 10. x ≥ 1 juga dijamin. Outputnya adalah integer tunggal, perkiraan f (x). Input dapat diambil dalam urutan apa pun (daftar sebelum x , atau x sebelum daftar). x juga bisa menjadi elemen pertama atau terakhir dari daftar, jika diinginkan.
Kasus uji:
[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
†: Perlu dicatat bahwa menggunakan metode pendekatan dalam situasi ini, sebenarnya, bodoh. Namun, fungsi yang paling sederhana mungkin dipilih untuk keperluan tantangan ini.
††: nilai aktualnya adalah -25⅓, yang akan memenuhi syarat perkiraan ini sebagai "tidak terlalu baik."
sumber
Jawaban:
Haskell , 38 byte
Cobalah online!
Ditingkatkan dari 39 byte:
Secara ekspresif mengekspresikan output
l%n
. Pindah ke atas terkait dengan pengurangann
, dan bergerak ke kanan berhubungan dengantail l
untuk menggeser semua elemen daftar satu ruang tersisa. Jadi, outputnyal%n
adalah nilai di atasl%(n-1)
, ditambah nilai di atas dan di sebelah kanan(tail l)%(n-1)
Kasing dasar
n==0
adalah untuk mengambil elemen daftar pertama.Idealnya, input akan diisi dengan banyak nol di sebelah kanan, karena turunan dari polinomial akhirnya menjadi nol. Kami mensimulasikan ini dengan menambahkan
0
ketika kami mengambiltail
.Aneh alt 41:
sumber
MATL , 9 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Jelly ,
65 byteCobalah online!
-1 byte terima kasih kepada @Doorknob
Penjelasan
sumber
Brachylog ,
1312 byteCobalah online!
Bagaimana itu bekerja
Solusi 13 byte sebelumnya
Cobalah online!
Bagaimana itu bekerja
sumber
Mathematica, 32 byte
sumber
Python ,
8058 byteCintai matematika untuk tantangan ini.
Cara kerjanya (hanya bekerja dengan python 2):
Cobalah online!
Alternatif 100 byte dengan menggunakan segitiga pascals
Cara kerjanya (berfungsi untuk python 2 dan 3):
Formula ini bekerja dengan memetakan koefisien baris
x
dari pascal segitiga ke array. Setiap elemen segitiga pascal ditentukan oleh fungsi pilih dari baris dan indeks. Jumlah array baru ini sama dengan output dix
. Ini juga intuitif karena proses iterasi metode newton (ditunjukkan dalam contoh) bertindak persis seperti konstruksi segitiga pascals.Cobalah online!
Terima kasih banyak untuk ovs karena mengurangi 22 byte dengan mengubah loop menjadi fungsi rekursif
sumber
Haskell,
5245 byteContoh penggunaan:
[-3,3,-3,3,-3,3,-3,3,-3] # 15
->-9009
. Cobalah online!Bagaimana itu bekerja
Edit: @xnatau disimpan 7 byte. Terima kasih!
sumber
zipWith(+)=<<tail.(++[0])
, yaitu memperbaiki daftar sebelumnya daripada sesudahnya.=<<
sini, ini gila :)=<<
digunakan dalam konteks fungsi dan didefinisikan sebagai:(=<<) f g x = f (g x) x
. Di sini kita menggunakan=<<
infix:(f =<< g) x
withf = zipWith(+)
dang = tail
, yang diterjemahkan menjadizipWith(+) (tail x) x
.CJam , 12 byte
Cobalah online!
Penjelasan
Kode secara langsung mengimplementasikan prosedur yang dijelaskan dalam tantangan.
sumber
Pyth , 10 byte
Suite uji.
Bagaimana itu bekerja
sumber
APL (Dyalog) , 29 byte
Cobalah online!
Ini adalah dfn rekursif, tetapi ternyata terlalu bertele-tele. Golf sedang berlangsung ...
sumber
Sebenarnya , 7 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Oktaf , 42 byte
Ini mendefinisikan fungsi anonim. Cobalah online!
Penjelasan
Solusi dapat dihitung dengan berulang kali menggabungkan array input dan array yang dihasilkan dengan
[1, 1]
. Tetapi berbelit dua kali, atau tiga kali, atau ... dengan[1, 1]
berkorespondensi dengan berbelit-belit sekali dengan[1, 2 ,1]
, atau[1, 3, 3, 1]
, atau ...; yaitu, dengan deretan segitiga Pascal. Ini diperoleh sebagai anti-diagonal dari matriks orde Pascalx+1
.sumber
JavaScript (ES6), 41 byte
Port @ xnor jawaban Haskell yang luar biasa. Solusi 47 byte sebelumnya.
sumber
Python 3 dengan Numpy , 82 byte
Mirip dengan jawaban MATL saya , tetapi menggunakan konvolusi ukuran penuh, dan hasilnya adalah
x
entri ke-10 dari array terakhir.Cobalah online!
sumber
Python , 51 byte
Cobalah online!
Ini adalah port jawaban Haskell saya .
sumber