Chiều cao cọc bát
Mục tiêu của câu đố này là tính chiều cao của một chồng bát.
Một cái bát được định nghĩa là một thiết bị đối xứng hoàn toàn không có độ dày. Hình dạng bóng của nó là một đa thức thậm chí. Ngăn xếp được mô tả bởi một danh sách bán kính, mỗi liên kết với một đa thức chẵn, được đưa ra làm đầu vào dưới dạng danh sách các hệ số (ví dụ: danh sách 3.1 4.2
đại diện cho đa thức ).
Đa thức có thể có mức độ tùy ý. Để đơn giản, chiều cao của cọc được định nghĩa là độ cao của tâm của bát trên cùng (xem sơ đồ của ví dụ 3 để minh họa).
Các trường hợp thử nghiệm có định dạng radius:coeff1 coeff2 ...
: mỗi dòng bắt đầu bằng một số float biểu thị bán kính của bát, theo sau là một dấu hai chấm và một danh sách được phân tách bằng dấu cách chứa các hệ số cho các lũy thừa, bắt đầu bằng lũy thừa 2 (ngụ ý phần không đổi) . Ví dụ, dòng 2.3:3.1 4.2
mô tả một bát bán kính 2.3
và đa thức hình dạng 3.1 * x^2 + 4.2 * x^4
.
ví dụ 1
42:3.141
mô tả một đống chiều cao bằng không vì một cái bát không có chiều cao.
Ví dụ 2
1:1 2
1.2:5
1:3
mô tả một đống chiều cao 2.0
(xem cốt truyện).
Ví dụ 3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
mô tả một đống chiều cao 0,8 (xem mũi tên màu xanh lá cây trong lô).
Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng.
Tôi có mã tham chiếu .
Chỉnh sửa:
Việc thực hiện tham chiếu dựa trên một thư viện để tính toán gốc của đa thức. Bạn cũng có thể làm điều đó nhưng bạn không cần phải làm vậy. Vì việc triển khai tham chiếu chỉ là một xấp xỉ bằng số (khá tốt), tôi sẽ chấp nhận bất kỳ mã nào tạo ra kết quả chính xác trong dung sai điểm nổi phổ biến.
Một biến thể khác của câu đố này là giảm thiểu chiều cao bằng cách sắp xếp lại các bát. Tôi không chắc có giải pháp nhanh không (tôi đoán đó là NP-hard). Nếu bất cứ ai có ý tưởng tốt hơn (hoặc có thể chứng minh tính đầy đủ NP), xin vui lòng cho tôi biết!
is_maximum
nên là ví dụ return evaluate(differentiate(shape_0), root) > 0.0
. Hiện tại, nó đánh giá gốc bằng cách sử dụng dd
(đạo hàm của sự khác biệt giữa các hình dạng), sẽ luôn trả về 0 (đối với gốc). Do lỗi dấu phẩy động, đôi khi kết quả là giá trị dương gần bằng 0, đó là lý do tại sao mã xuất ra kết quả chính xác hoặc chính xác hơn trong một số thời gian. Kiểm tra đầu vào 1:0.2, 1:0.1 0.2
sẽ xuất0.0125
0.801
. Hai bát cuối cùng chạm vào bán kính 0.1
.