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żej0.01
szeregu wartości.Odpowiedzi:
05AB1E , 43 bajty
Wyjaśnienie
Wypróbuj online!
źródło
Haskell,
10398 bajtówźródło
Python 3,
168164 bajtówDzięki @ Adám i @Mego za -2 bajty każdy
Funkcja,
f
która pobiera dane wejściowe za pomocą argumentu i zwraca listę przesunięć linii, w tym0
dla najbardziej wewnętrznej linii.Jak to działa
Wykorzystuje to przybliżenie Ramanujana. Po prostu definiujemy funkcje
h
iC
do obliczania parametru i obwodu, a następnie odejmujemy długość najbardziej wewnętrznego pasa od długości bieżącego pasa i podłogi, dla wszystkich pasów.Wypróbuj na Ideone
źródło
sqrt(4-3*h(a,b))
jest krótszy(4-3*h(a,b))**.5
ifloor
można go zastąpićint
. Wykonanie obu tych czynności oznacza, że nie musisz importowaćmath
.3*
inh
, należy zapisać dwa bajty.pi
Być może będziesz w stanie zakodować go z wystarczającą precyzją. I tak, pierwsze dwa są tej samej długości - oczywiście miałem na myśli bez importu! : PDyalog APL , 45 bajtów
Zachęty do n , a następnie za pomocą b . Wymaga
⎕IO←0
ustawienia domyślnego w wielu systemach.⍳⎕
monit o n , a następnie podaj {0, 1, 2, ..., n −1)5×
pomnożyć przez pięć uzyskać {0, 5, 10, ..., 5 n -5}⎕∘.+
szybka na i B , a następnie dokonać tabelę Dodawać , +5 +10 ... +5 n -5 b , b + 5, b +10 ... b + 5 N −5(
...)⌿
zastosuj funkcję w nawiasach do każdej pary pionowej, tj.f ( a , b ), f ( a +5, b +5), f ( a +10, b +10), ..., f ( a + 5 n -5, b + 5 n -5)
gdzie f ( x , y ) jest *
(⊢-⊃)
na wyniku funkcji zastosowanej do każdej pary odejmij wartość pierwszego wyniku1↓
usuń pierwszy (zero)⌊
zaokrąglić w dółWypróbuj APL online!
* W języku proceduralnym:
-÷+
znaleźć ułamek różnicy, a suma x i y2*⍨
kwadrat ten ułamek3×
pomnóż ten kwadrat przez trzyh←
przypisz ten produkt do h4-
odejmij ten produkt od czterech.5*⍨
oblicz pierwiastek kwadratowy z tej różnicy10+
dodaj dziesięć do tego pierwiastka kwadratowegoh÷
podziel h przez tę sumę1+
dodaj jeden do tej frakcji+×
pomnożyć suma przy czym suma x i y○
pomnóż ten produkt przez piźródło