スタッガードスタート


13

レーサーがカーブしたトラックの少なくとも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:]])))

使用される近似は次のとおりです。

楕円円周近似

最後に、オフセットの計算を理解するのに役立つ図を次に示します。

追跡


あなたと同じようにラマヌジャンの近似を使用します。それは私たちがやるべきことですか、それとも無限級数の収束を評価したいですか?
アダム

1
@Adám必要な精度を得るために必要なことは何でもできます。ラマヌジャン近似は多くの値に適しています。なぜなら、その誤差はのオーダーでありh**50.01広範囲の値に対して十分に小さいからです。
メゴ

入力サイズに制限がない場合、最小精度はどの程度優れていますか?
feersum

回答:


2

05AB1E、43バイト

UVFXY-nXY+WZn/3*©T4®-t+/>Z*žq*5DX+UY+V})¬-ï

説明

UV                                           # X = a, Y = b
  F                                   }      # n times do
   XY-n                                      # (a-b)^2
       XY+W                                  # Z = (a + b)
             /                               # divide (a-b)^2
           Zn                                # by (a+b)^2
              3*                             # multiply by 3
                ©                            # C = 3h
                       /                     # 3h divided by 
                 T                           # 10
                      +                      # +
                  4®-t                       # sqrt(4-3h)
                        >                    # increment
                         Z*žq*               # times (a + b)*pi
                              5DX+UY+V       # increase a and b by 5
                                       )     # wrap in list of circumferences
                                        ¬-   # divide by inner circumference
                                          ï  # floor
                                             # implicitly display

オンラインでお試しください!


2

Haskell、103 98バイト

c!d|h<-3*d*d/c/c=pi*c*(1+h/(10+sqrt(4-h)))
f a b n|x<-a-b=[floor$(a+b+10*w)!x-(a+b)!x|w<-[1..n-1]]

1

Python 3、168 164バイト

それぞれ-2バイトの@Adámと@Megoに感謝

from math import*
h=lambda a,b:3*(a-b)**2/(a+b)**2;C=lambda a,b:pi*(a+b)*(1+h(a,b)/(10+sqrt(4-h(a,b))))
f=lambda a,b,n:[int(C(a+i*5,b+i*5)-C(a,b))for i in range(n)]

f引数を介して入力を受け取り0、最も内側の車線を含む車線オフセットのリストを返す関数。

使い方

これは、ラマヌジャンの近似を使用しています。関数hを定義するだけですC、パラメータと円周を計算で、すべてのレーンについて、現在のレーンとフロアの長さから最も内側のレーンの長さを引きます。

Ideoneでお試しください


sqrt(4-3*h(a,b))はとして短く、(4-3*h(a,b))**.5floor置き換えることができますint。これらの両方を行うと、インポートする必要がなくなりますmath
メゴ

@Megoありがとう。愚かでなければ、最初の2つは同じ長さではないでしょうか?ただし、importステートメントが削除されると、piを定義する問題が発生します。
TheBikingViking

3*in を含めることにより、h2バイトを節約する必要があります。
アダム

私はpiあなたが使用することを完全に逃しました。あなたはそれを十分な精度でハードコーディングできるかもしれません。そして、ええ、最初の2つは同じ長さです-もちろん、インポートなしでした!:P
メゴ

@Adámそれを指摘してくれてありがとう。
TheBikingViking

1

Dyalog APL、45 バイト

以下のためのプロンプトのnについて、その後、B ます。⎕IO←0多くのシステムでデフォルトである必要があります。

1↓(⊢-⊃)(○+×1+h÷10+.5*⍨4-h3×2*⍨-÷+)⌿⎕∘.+5×⍳⎕

⍳⎕ プロンプト nの、{0、1、2、...、n -1)を与える

乗算5によって{0、5、10、...、5得るためにN -5}

⎕∘.+プロンプトおよびBは、加算テーブルます、5、10、... +5 N -5 、BB 5、B 10、... Bを
  
   +5 n個 −5

(... )⌿各垂直ペアに括弧付き関数を適用します。つまり、
  fab)、fa + 5、b +5)、fa + 10、b +10)、...、fa + 5 N -5、B +5 N -5)
  ここで、fはXY)であり、*

パイタイム

x + y)回

1+ ワンプラス

hxy)[関数hは後で定義されます]

10+ テンプラス

.5*⍨ の平方根

4- 4マイナス

h← hxy)、

三回

2*⍨ の正方形

xy)で除算

+ x + y

(⊢-⊃) 各ペアに適用された関数の結果で、最初の結果の値を引きます

1↓ 最初の(ゼロ)を削除します

切り捨てる

TryAPLオンライン!


*手続き言語:

-÷+xyの差と和の差の分数を求める

2*⍨ その分数を二乗する

その正方形に3を掛ける

h←その製品をhに割り当てる

4- 4からその製品を引きます

.5*⍨ その差の平方根を取る

10+ その平方根に10を加えます

hをその合計で割る

1+ その分数に1を加えます

その合計にxyの合計を掛けます

その積にpiを掛けます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.