Висота ворсу чаші
Мета цієї головоломки - обчислити висоту стопки чаш.
Чаша визначається як радіально симетричний пристрій без товщини. Його силуетна форма - рівномірний. Стек описується списком радіусів, кожен з яких пов'язаний з рівним многочленом, подається як вхід у вигляді списку коефіцієнтів (наприклад, список 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-повноту), будь ласка, скажіть мені!
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
.