W wyścigach, w których zawodnicy omijają co najmniej jeden zakręt zakrzywionego toru, pozycje startowe dla każdego z zawodników są rozłożone w taki sposób, że każdy zawodnik pokonuje tę samą odległość wokół toru (w przeciwnym razie zawodnik na najbardziej wewnętrznej linii miałby ogromną przewagę ).
Biorąc pod uwagę długości głównych i podrzędnych osi (lub pół-głównych i pół-mniejszych, jeśli wolisz) toru eliptycznego oraz liczbę torów na torze, wyprowadzaj odległości od punktu początkowego najbardziej wewnętrznego pasa, że każdy tor powinien być rozłożony.
Dane techniczne
- Każdy pas jest elipsą z pół-głównymi osiami o 5 jednostek dłuższymi niż następny najkrótszy pas. Dla uproszczenia załóżmy, że ścieżki mają szerokość 0.
- Najbardziej wewnętrzny pas zawsze zaczyna się od 0, a każdy inny punkt początkowy jest dodatnią liczbą całkowitą większą lub równą poprzedniemu punktowi początkowemu.
- Dane wejściowe i wyjściowe mogą być w dowolnym dogodnym i rozsądnym formacie.
- Wejściami zawsze będą liczby całkowite.
- Należy obliczyć obwód toru z dokładnością do 0,01 jednostki rzeczywistej wartości.
- Wyjścia należy zaokrąglić w dół do najbliższej liczby całkowitej (zmiennoprzecinkowej).
- Linia mety jest punktem startowym dla najbardziej wewnętrznego kierowcy. W wyścigu jest tylko jedno okrążenie.
- Długości osi są mierzone przy użyciu najbardziej wewnętrznego pasa toru.
- Podanie 0 dla przesunięcia najbardziej wewnętrznego pasa jest opcjonalne.
Przypadki testowe
Format: 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
Te przypadki testowe zostały wygenerowane za pomocą następującego skryptu Python 3, który wykorzystuje przybliżenie obwodu elipsy opracowanej przez Ramanujana:
#!/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:]])))
Zastosowane przybliżenie to:
Na koniec znajduje się pomocny schemat do zrozumienia obliczeń przesunięć:
h**5
, co jest znacznie poniżej 0.01
szeregu wartości.