Высота ворса чаши
Цель этой головоломки - вычислить высоту стопки мисок.
Чаша определяется как радиально-симметричное устройство без толщины. Его форма силуэта является ровным полиномом. Стек описывается списком радиусов, каждый из которых связан с четным полиномом, заданным в качестве входных данных в виде списка коэффициентов (например, список 3.1 4.2
представляет полином ).
Полином может иметь произвольную степень. Для простоты высота кучи определяется как высота центра самой верхней чаши (см. Иллюстрацию в примере 3).
Контрольные примеры имеют формат radius:coeff1 coeff2 ...
: каждая строка начинается с числа с плавающей точкой, представляющего радиус чаши, за которым следует двоеточие и разделенный пробелами список, содержащий коэффициенты для четных степеней, начиная с степени 2 (подразумевается нулевая константа) , Например, линия 2.3:3.1 4.2
описывает чашу радиуса 2.3
и форму-полином 3.1 * x^2 + 4.2 * x^4
.
Пример 1
42:3.141
описывает кучу нулевой высоты, так как одна чаша не имеет высоты.
Пример 2
1:1 2
1.2:5
1:3
описывает кучу высоты 2.0
(см. график).
Пример 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
описывает кучу высотой 0,8 (см. зеленую стрелку на графике).
Это код гольф, поэтому выигрывает самый короткий код.
У меня есть код ссылки .
Редактировать:
Эталонная реализация опирается на библиотеку для вычисления корней полиномов. Вы можете сделать это, но вам не нужно. Поскольку эталонная реализация является лишь (довольно хорошим) числовым приближением, я приму любой код, который дает правильные результаты в пределах общих допусков с плавающей точкой.
Идея имеет значение. Мне все равно, если есть небольшие ошибки .
Другой вариант этой загадки - минимизировать высоту, изменяя порядок мисок. Я не уверен, есть ли быстрое решение (я думаю, это NP-сложный). Если у кого-то есть идея получше (или она может доказать NP-полноту), пожалуйста, скажите мне!
is_maximum
должно быть, напримерreturn evaluate(differentiate(shape_0), root) > 0.0
. В настоящее время он вычисляет корень, используяdd
(производная от разницы между формами), который всегда должен возвращать 0 (для корней). В связи с плавающей точкой ошибки, то результат будет иногда положительное значение близко к 0, поэтому код выводит правильный или более точный результат некоторые из времени. Проверьте вход,1:0.2, 1:0.1 0.2
который должен выводить0.0125
0.801
. Последние две чаши соприкасаются в радиусе0.1
.Ответы:
Желе ,
5453 байтаПопробуйте онлайн!
Монадическая ссылка, которая принимает в качестве аргумента список чаш сверху вниз в формате
[[b1_radius, b1_coef1, ...], [b2_radius, b2_coef1, ...]]
и возвращает позицию y нижней части верхней чаши.Теперь правильно обрабатывает чаши, которые встречаются в местах, отличных от минимального радиуса.
объяснение
Вспомогательная ссылка: принимает в качестве левого аргумента
l
различия в коэффициентах полиномов, представляющих чаши от 1 вверх, а в качестве правого аргументаr
- минимальный радиус; возвращает максимальное значение у, где встречаются две чашиОсновная ссылка, принимает в качестве аргумента кучу чаши и возвращает значение у основания верхней чаши
Python ссылка
Наконец, вот TIO-версия ссылки на Python, которую @pasbi включил для основной проблемы. Это читает со стандартного ввода.
источник
(r1, p1)
и(r2, p2)
по существуmin(r1, r2)
? Если это так, это было бы неправильным решением, потому что две чаши могут касаться между0
иmin(r1, r2))
. Вам нужно найтиmax(p1(x)-p2(x), 0)
во всем диапазоне[0, min(r1, r2)]
дляx
. Вот почему эталонное решение @ pasbi вычисляет производные для нахождения локального максимума.min(r1, r2)
. Это теперь решает дополнительную проблему @ attinatPython 3 + Numpy + Scipy,
248240 байтПопробуйте онлайн!
-8 байт благодаря @xnor
Функция принимает список
[radius, polynomial]
пар в качестве входных данных и возвращает высоту стопки.Это решение использует более или менее тот же алгоритм, что и ссылочный код, за исключением того, что оно не вычисляет максимум с использованием производных. Между тем, он написан с использованием встроенных
numpy
иscipy
функций в Python. Развернутая версия показана ниже. Это служит альтернативной версией ссылочного кода для тех, кто хочет, чтобы более короткая версия быстро уловила идею.Попробуйте онлайн!
источник
i=0
в качестве необязательного аргумента.Wolfram Language (Mathematica) ,
10493 байтаПопробуйте онлайн!
{radius, polynomial}
Вместо десятичного вместо символьного вывода используйте
NMaxValue
вместо него (или просто вызовитеN
результат).источник
R ,
451436 байтПопробуйте онлайн!
Попробуйте онлайн!
Говоря в общем, R-порт моего Jelly ответа, хотя, поскольку база R не имеет функции для поиска корней полиномов, это реализовано с использованием метода, описанного в
polynom::solve.polynomial
.Функция, принимающая список числовых векторов сверху вниз.
Спасибо @RobinRyder за добавление в игру 15 байтов!
источник