Высота ворса чаши
Цель этой головоломки - вычислить высоту стопки мисок.
Чаша определяется как радиально-симметричное устройство без толщины. Его форма силуэта является ровным полиномом. Стек описывается списком радиусов, каждый из которых связан с четным полиномом, заданным в качестве входных данных в виде списка коэффициентов (например, список 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
.