Цель этой задачи - использовать метод Эйлера для аппроксимации решения дифференциального уравнения вида f (n) (x) = c. †
Входными данными будет список целых чисел, в которых n- е значение представляет значение f (n) (0). Первое целое число - это f (0), второе - это f '(0) и так далее. Последнее целое число в этом списке является константой и всегда останется неизменным.
Также в качестве входных данных будет предоставлено положительное (ненулевое) целое число x , которое представляет целевое значение (вы пытаетесь оценить f (x)). Размер шага для метода Эйлера всегда будет равен 1. Таким образом, вам нужно будет сделать х шагов всего.
Если вы не знакомы с методом Эйлера, вот подробный пример с объяснением ввода [4, -5, 3, -1]
, х = 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
По сути, каждая ячейка в сгенерированной таблице является суммой ячейки над ней и ячейки сверху и справа. Итак, f (a) = f (a-1) + f '(a-1); f '(a) = f' (a-1) + f '' (a-1); и f '' (a) = f '' (a-1) + f '' '(a-1). Окончательный ответ: f (8) ≈ -8. ††
Входной список всегда будет содержать 2 или более элементов, каждый из которых будет иметь абсолютные значения менее 10. x ≥ 1 также гарантируется. Выходные данные представляют собой одно целое число, приближение f (x). Ввод может быть сделан в любом порядке (список перед x или x перед списком). x также может быть первым или последним элементом списка, если это необходимо.
Тестовые случаи:
[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
† Примечательно, что использование метода приближения в этой ситуации, на самом деле, глупо. однако для целей этой задачи была выбрана самая простая возможная функция.
††: фактическое значение составляет -25⅓, что квалифицирует это приближение как «не очень хорошее».
источник
Ответы:
Haskell , 38 байт
Попробуйте онлайн!
Улучшено с 39 байтов:
Рекурсивно выражает вывод
l%n
. Перемещение вверх соответствует уменьшениюn
, а перемещение вправо соответствуетtail l
сдвигу всех элементов списка на один пробел влево. Таким образом, выходноеl%n
значение является значением вышеl%(n-1)
, плюс значение выше и справа(tail l)%(n-1)
Базовый случай
n==0
состоит в том, чтобы взять первый элемент списка.В идеале вход должен дополняться бесконечным числом нулей справа, поскольку производные полинома в конечном итоге становятся равными нулю. Мы моделируем это, добавляя,
0
когда мы беремtail
.Странный альт 41:
источник
MATL , 9 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Желе ,
65 байтПопробуйте онлайн!
-1 байт благодаря @ Doorknob
объяснение
источник
Брахилог ,
1312 байтПопробуйте онлайн!
Как это работает
Предыдущее 13-байтовое решение
Попробуйте онлайн!
Как это работает
источник
Mathematica, 32 байта
источник
Python ,
8058 байтЛюблю математику для этого вызова.
Как это работает (работает только с Python 2):
Попробуйте онлайн!
100 байтов чередуются с использованием треугольника паскалей
Как это работает (работает для Python 2 и 3):
Эта формула работает путем сопоставления коэффициентов строки
x
из Треугольника Паскаля на массив. Каждый элемент треугольника Паскаля определяется функцией выбора строки и индекса. Сумма этого нового массива эквивалентна выводу вx
. Это также интуитивно понятно, так как повторяющийся процесс метода Ньютона (показанный в примере) действует точно так же, как построение треугольника Паскаля.Попробуйте онлайн!
Большое спасибо ovs за сокращение 22 байтов путем преобразования цикла в рекурсивную функцию
источник
Haskell,
5245 байтПример использования:
[-3,3,-3,3,-3,3,-3,3,-3] # 15
->-9009
. Попробуйте онлайн!Как это работает
Редактировать: @xnor сохранил 7 байтов. Спасибо!
источник
zipWith(+)=<<tail.(++[0])
, то есть исправить список заранее, а не после.=<<
=<<
используется в контексте функции и определяется как:(=<<) f g x = f (g x) x
. Здесь мы используем=<<
infix:(f =<< g) x
withf = zipWith(+)
иg = tail
, что переводится какzipWith(+) (tail x) x
.CJam , 12 байт
Попробуйте онлайн!
объяснение
Код непосредственно реализует процедуру, описанную в задании.
источник
Pyth , 10 байт
Тестирование.
Как это работает
источник
APL (Dyalog) , 29 байт
Попробуйте онлайн!
Это рекурсивный dfn, но он оказывается слишком многословным. Гольф в прогрессе ...
источник
На самом деле 7 байтов
Попробуйте онлайн!
Как это работает
источник
Октава , 42 байта
Это определяет анонимную функцию. Попробуйте онлайн!
объяснение
Решение может быть вычислено путем многократного свертывания входного массива и полученных массивов с
[1, 1]
. Но сворачивание дважды, или трижды, или ... с[1, 1]
соответствует сворачиванию один раз с[1, 2 ,1]
, или[1, 3, 3, 1]
, или ...; то есть с рядом треугольника Паскаля. Это получается как антидиагональ матрицы порядка Паскаляx+1
.источник
JavaScript (ES6), 41 байт
Порт @ xnor отличный ответ на Haskell. Предыдущее 47-байтовое решение.
источник
Python 3 с Numpy , 82 байта
Аналогично моему ответу на MATL , но с использованием полноразмерной свертки, и, следовательно, результатом является
x
-ая запись окончательного массива.Попробуйте онлайн!
источник
Python , 51 байт
Попробуйте онлайн!
Это порт моего ответа на Haskell .
источник