그릇 더미 높이
이 퍼즐의 목표는 그릇 더미의 높이를 계산하는 것입니다.
보울은 두께가없는 방사상 대칭 장치로 정의됩니다. 실루엣 모양은 다항식입니다. 스택은 계수 목록으로 입력으로 주어진 각각의 짝수 다항식과 관련된 반지름 목록으로 설명됩니다 (예 : 목록 3.1 4.2
은 다항식 나타냄).
다항식은 임의의 정도를 가질 수 있습니다. 간단하게 말해서, 파일의 높이는 가장 높은 그릇의 중심의 고도로 정의됩니다 (그림은 예제 3의 도표 참조).
테스트 사례는 다음과 같은 형식으로되어 있습니다 radius:coeff1 coeff2 ...
. 각 라인은 보울의 반경을 나타내는 플로트 번호로 시작하고 콜론과 짝수 전력에 대한 계수를 포함하는 공백으로 구분 된 목록으로 시작합니다. . 예를 들어, 선 2.3:3.1 4.2
은 반지름 2.3
과 모양-다항식을 나타 3.1 * x^2 + 4.2 * x^4
냅니다.
실시 예 1
42:3.141
단일 그릇에 높이가 없으므로 높이가 0 인 더미를 나타냅니다.
실시 예 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
.