Bei Rennen, bei denen die Rennfahrer mindestens eine Kurve einer gekrümmten Strecke zurücklegen, sind die Startpositionen für jeden Rennfahrer gestaffelt, sodass jeder Rennfahrer die gleiche Strecke auf der Strecke zurücklegt (andernfalls hätte der Rennfahrer auf der innersten Spur einen großen Vorteil ).
Ausgehend von der Länge der Haupt- und Nebenachse (oder der Halb-Haupt- und Halb-Nebenachse, wenn Sie dies vorziehen) einer elliptischen Spur und der Anzahl der Spuren in der Spur geben Sie die Abstände vom Startpunkt der innersten Spur für jede Spur aus sollte gestaffelt sein.
Spezifikationen
- Jede Spur ist eine Ellipse mit halbrunden Achsen, die 5 Einheiten länger sind als die nächstkürzere Spur. Nehmen Sie der Einfachheit halber an, dass die Fahrspuren eine Breite von 0 haben.
- Die innerste Spur beginnt immer bei 0, und jeder zweite Startpunkt ist eine positive ganze Zahl, die größer oder gleich dem vorherigen Startpunkt ist.
- Die Ein- und Ausgabe kann in jedem geeigneten und vernünftigen Format erfolgen.
- Die Eingaben sind immer Ganzzahlen.
- Sie müssen den Umfang der Spur auf 0,01 Einheiten vom tatsächlichen Wert aus berechnen.
- Die Ausgaben sind auf die nächste Ganzzahl (Floored) abzurunden.
- Die Ziellinie ist der Startpunkt für den innersten Rennfahrer. Es gibt nur eine Runde im Rennen.
- Die Längen der Achsen werden auf der innersten Spur der Spur gemessen.
- Die Ausgabe der 0 für den Versatz der innersten Spur ist optional.
Testfälle
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
Diese Testfälle wurden mit dem folgenden Python 3-Skript generiert, das eine von Ramanujan entwickelte Annäherung des Umfangs einer Ellipse verwendet:
#!/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:]])))
Die verwendete Annäherung ist:
Schließlich ist hier ein hilfreiches Diagramm zum Verständnis der Berechnungen der Offsets:
h**5
, die0.01
für einen weiten Bereich von Werten weit darunter liegt.Antworten:
05AB1E , 43 Bytes
Erläuterung
Probieren Sie es online!
quelle
Haskell,
10398 Bytesquelle
Python 3,
168164 BytesVielen Dank an @ Adám und @ Mego für jeweils -2 Bytes
Eine Funktion
f
, die Eingaben über Argumente entgegennimmt und eine Liste von Spurversätzen zurückgibt, auch0
für die innerste Spur.Wie es funktioniert
Dies verwendet Ramanujans Annäherung. Wir definieren einfach Funktionen
h
undC
für die Berechnung des Parameters und Umfang, dann ziehen Sie die Länge der innersten Spur von der Länge der aktuellen Spur und Boden, für alle Spuren.Probieren Sie es auf Ideone
quelle
sqrt(4-3*h(a,b))
ist kürzer als(4-3*h(a,b))**.5
undfloor
kann durch ersetzt werdenint
. Beides bedeutet, dass Sie nicht importieren müssenmath
.3*
inh
, sollten Sie zwei Bytes speichern.pi
Möglicherweise können Sie es mit ausreichender Präzision fest codieren. Und ja, die ersten beiden sind gleich lang - ich meinte natürlich ohne den Import! : PDyalog APL , 45 Bytes
Fragt nach n , dann nach a b . Benötigt,
⎕IO←0
was auf vielen Systemen Standard ist.⍳⎕
Eingabeaufforderung für n , dann geben Sie {0, 1, 2, ..., n −1)5×
von fünf multiplizieren erhalten {0, 5, 10, ..., 5 n -5}⎕∘.+
Eingabeaufforderung für ein und b , so ist ein Additionstabelle machen:a , a 5, a + 10, ... a +5 n -5
b , b +5, b + 10, ... b +5 n −5
(
...)⌿
wende die Funktion in Klammern auf jedes vertikale Paar an, dhf ( a , b ), f ( a +5, b +5), f ( a +10, b +10), ..., f ( a +) 5 n -5, b +5 n - 5) ,
wo f ( x , y ) ist *
(⊢-⊃)
Subtrahieren Sie für das Ergebnis der auf jedes Paar angewendeten Funktion den Wert des ersten Ergebnisses1↓
entferne die erste (Null)⌊
abrundenTryAPL online!
* In Verfahrenssprache:
-÷+
Finden Sie den Bruchteil der Differenz zwischen und der Summe von x und y2*⍨
Quadrieren Sie diesen Bruch3×
multiplizieren Sie dieses Quadrat mit dreih←
Weisen Sie dieses Produkt zu h4-
subtrahieren Sie das Produkt von vier.5*⍨
Nimm die Quadratwurzel dieses Unterschieds10+
Addiere zehn zu dieser Quadratwurzelh÷
teile h durch diese Summe1+
addiere eins zu diesem Bruch+×
multiplizieren Sie diese Summe mit der Summe von x und y○
Multiplizieren Sie dieses Produkt mit piquelle