レーサーがカーブしたトラックの少なくとも1回転を回るレースでは、各レーサーの開始位置がずらされているため、各レーサーはトラックの同じ距離を移動します(そうでなければ、最も内側の車線のレーサーが大きな利点を持ちます)。
楕円形のトラックの長軸と短軸(または必要に応じてセミメジャーとセミマイナー)の長さとトラック内の車線の数を指定して、各車線の最も内側の車線の開始点からの距離を出力しますずらす必要があります。
仕様書
- 各レーンは、半長軸が次に短いレーンより5ユニット長い楕円形です。簡単にするために、レーンの幅は0であると仮定します。
- 最も内側の車線は常に0から始まり、他のすべての開始点は前の開始点以上の正の整数です。
- 入力および出力は、便利で妥当な形式であれば何でもかまいません。
- 入力は常に整数です。
- 実際の値の0.01単位以内でトラックの円周を計算する必要があります。
- 出力は、最も近い整数に切り捨てられます(フロア)。
- フィニッシュラインは、最も内側のレーサーの出発点です。レースには1ラップしかない。
- 軸の長さは、トラックの最も内側の車線を使用して測定されます。
- 最も内側の車線のオフセットに0を出力することはオプションです。
テストケース
フォーマット: a, b, n -> <list of offsets, excluding innermost lane>
20, 10, 5 -> 30, 61, 92, 124
5, 5, 2 -> 31
15, 40, 7 -> 29, 60, 91, 121, 152, 183
35, 40, 4 -> 31, 62, 94
これらのテストケースは、Ramanujanによって考案された楕円の円周の近似値を使用する次のPython 3スクリプトで生成されました。
#!/usr/bin/env python3
import math
a = 35 # semi-major axis
b = 40 # semi-minor axis
n = 4 # number of lanes
w = 5 # spacing between lanes (constant)
h = lambda a,b:(a-b)**2/(a+b)**2
lane_lengths = [math.pi*(a+b+w*i*2)*(1+3*h(a+w*i,b+w*i)/(10+math.sqrt(4-3*h(a+w*i,b+w*i)))) for i in range(n)]
print("{}, {}, {} -> {}".format(a, b, n, ', '.join([str(int(x-lane_lengths[0])) for x in lane_lengths[1:]])))
使用される近似は次のとおりです。
最後に、オフセットの計算を理解するのに役立つ図を次に示します。
h**5
、0.01
広範囲の値に対して十分に小さいからです。