En las carreras en las que los corredores recorren al menos una vuelta de una pista curva, las posiciones iniciales para cada corredor se escalonan, de modo que cada corredor recorre la misma distancia alrededor de la pista (de lo contrario, el corredor en el carril más interno tendría una gran ventaja )
Dadas las longitudes de los ejes mayor y menor (o semi-mayor y semi-menor, si lo prefiere) de una pista elíptica y el número de carriles en la pista, muestre las distancias desde el punto de inicio del carril más interno que cada carril. debe ser escalonado
Especificaciones
- Cada carril es una elipse con ejes semi-principales 5 unidades más largos que el siguiente carril más corto. Para simplificar, suponga que los carriles tienen un ancho de 0.
- El carril más interno siempre comienza en 0, y cualquier otro punto de partida es un número entero positivo mayor o igual que el punto de partida anterior.
- La entrada y la salida pueden estar en cualquier formato conveniente y razonable.
- Las entradas siempre serán enteras.
- Debe calcular la circunferencia de la pista dentro de 0.01 unidades del valor real.
- Las salidas se deben redondear al entero más cercano (con piso).
- La línea de meta es el punto de partida para el corredor más interno. Solo hay una vuelta en la carrera.
- Las longitudes de los ejes se miden utilizando el carril más interno de la pista.
- La salida del 0 para el desplazamiento del carril más interno es opcional.
Casos de prueba
Formato: 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
Estos casos de prueba se generaron con el siguiente script de Python 3, que utiliza una aproximación de la circunferencia de una elipse ideada por Ramanujan:
#!/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:]])))
La aproximación utilizada es:
Finalmente, aquí hay un diagrama útil para comprender los cálculos de las compensaciones:
h**5
, que está muy 0.01
por debajo de una amplia gama de valores.