ボウル杭高さ
このパズルの目標は、ボウルの山の高さを計算することです。
ボウルは、厚さのない放射状に対称なデバイスとして定義されます。そのシルエット形状は偶数多項式です。スタックは、それぞれが偶数の多項式に関連付けられた半径のリストで記述され、係数のリストとして入力として与えられます(たとえば、リスト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
単一のボウルには高さがないため、高さゼロのパイルを表します。
例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のパイルを示します(プロットの緑の矢印を参照)。
これはコードゴルフなので、最短のコードが勝ちます。
私が持っている参照コードを。
編集:
リファレンス実装は、ライブラリを使用して多項式の根を計算します。あなたもそれを行うことができますが、する必要はありません。参照実装は(非常に良い)数値近似にすぎないため、一般的な浮動小数点の許容範囲内で正しい結果を生成するコードを受け入れます。
アイデアは重要です。小さなerrosがあるかどうかは気にしません。
このパズルのもう1つのバリエーションは、ボウルを並べ替えて高さを最小化することです。高速な解決策があるかどうかはわかりません(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
。最後の2つのボウルは半径で接触し0.1
ます。