Nas corridas em que os corredores percorrem pelo menos uma curva de uma pista curva, as posições iniciais de cada corredor são escalonadas, de modo que cada corredor percorre a mesma distância ao redor da pista (caso contrário, o corredor na pista mais interna teria uma grande vantagem )
Dados os comprimentos dos eixos maior e menor (ou semi-maior e semi-menor, se você preferir) de uma pista elíptica e o número de faixas na pista, produza as distâncias do ponto inicial da pista mais interna em que cada pista deve ser escalonado.
Especificações
- Cada pista é uma elipse com eixos semi-principais 5 unidades a mais que a próxima pista mais curta. Para simplificar, suponha que as faixas tenham largura 0.
- A faixa mais interna sempre começa em 0 e todos os outros pontos de partida são um número inteiro positivo maior ou igual ao ponto de partida anterior.
- A entrada e a saída podem estar em qualquer formato conveniente e razoável.
- As entradas sempre serão inteiras.
- Você deve calcular a circunferência da pista dentro de 0,01 unidades do valor real.
- As saídas devem ser arredondadas para o número inteiro mais próximo (no chão).
- A linha de chegada é o ponto de partida para o corredor mais interno. Há apenas uma volta na corrida.
- Os comprimentos dos eixos são medidos usando a faixa mais interna da pista.
- A saída de 0 para o deslocamento da pista mais interna é opcional.
Casos de teste
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
Esses casos de teste foram gerados com o seguinte script Python 3, que usa uma aproximação da circunferência de uma elipse criada 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:]])))
A aproximação usada é:
Finalmente, aqui está um diagrama útil para entender os cálculos das compensações:
h**5
, o que é muito baixo 0.01
para uma ampla faixa de valores.