与えられたタスクはx
output 2*x
です。簡単ですよね!?しかし、キャッチx
があります:(おそらく無限の)継続分数として与えられ、出力は継続分数でなければなりません。入力は、次数が最大2の実代数になることが保証されています。
入力:x
。これは、整数部分、プレフィックス、および繰り返し部分の3つの部分に分割されます。整数部分は単一の整数で構成されます。プレフィックスと繰り返し部分は、連続した分数のプレフィックスと繰り返し部分を記述する正の整数の配列(空の場合もあります)です。たとえば、入力(3, [1], [2, 4])
は連続分数を表し[3; 1, 2, 4, 2, 4, ...]
ます。
繰り返し部分が空の場合、それは有理数を示します。たとえば、を(3, [1, 2], [])
表し[3; 1, 2] = 11/3
ます。両方の形式の有理数を受け入れる必要があります(つまり(3, [1, 1, 1], [])
、これ[3; 1, 1, 1] = 11/3
も有効な入力である必要があります)。
出力:入力と同じ形式で、入力の2倍の連続した部分を出力します。出力が合理的であれば、どちらの形式の連続分数も出力できます。答えが正解と同等である限り、それは問題ありません。「圧縮」は必要ないので、無限部分は少し「展開」される可能性が[1; 4, 2, 3, 2, 3...]
あります(たとえば、書かれ(1, [4], [2, 3])
たり(1, [4, 2, 3], [2, 3])
)。すべての答えは正確でなければなりません。
テストケース:正確な形式の列は、便宜上提供されています。
Input Exact Form Output
(0, [] []) 0 (0, [] []) or (-1, [1], [])
(-5, [1, 1], []) -4.5 (-9, [], []) or (-10, [1], [])
(3, [1, 2], []) 11/3 (7, [3], []) or (7, [2, 1], [])
(1, [], [2]) sqrt(2) (2, [], [1, 4])
(-1, [2], [2, 1]) -1/sqrt(3) (-2, [1, 5], [2, 6])
最後に、精度を確保するためのわずかに大きいテストケース:(0, [1], [6, 1, 3, 1, 42, 1, 3, 1, 6, 2]) --> (1, [], [1, 2, 1, 8, 1, 20, 1, 8, 1, 2, 1, 2])
。
最短のコードが勝ちます!
ヒント:ここで説明するように、連続した分数に対してかなり簡単に算術演算を実行できます。継続分数を2倍にすることは、このアルゴリズムの特殊なケースにすぎません(ただし、継続分数が繰り返されるタイミングを見つけるのは難しい場合があります)。
Sqrt[2]
。
[3; 1, 1, 1]
だろう(3, [1, 1, 1], [])
、我々が使用している入力フォーマットに-質問はおそらく明確性を確保するために、(第3段落で)その形式でそれを言及する必要がありますので。
(-2, [1, 5, 2], [6, 2])
、入力に対して許容可能な出力でしょう(-1, [2], [2, 1])
か?どう(-2, [1, 5, 2, 6, 2, 6], [2, 6])
?