Um gato quase sem massa é jogado no espaço (não se preocupe, com um traje espacial e tudo) no ponto (x, y, z)
com velocidade (vx, vy, vz)
. Existe um planeta fixo infinitamente denso (com volume de 0) no ponto (0, 0, 0)
e atrai objetos à distância r
com aceleração 1/r^2
. De acordo com a gravidade newtoniana, para onde o objeto vai depois do tempo t
?
Quase sem massa, neste caso, significa que você está produzindo o valor de lim (mass --> 0) <position of cat>
. A massa é afetada pela gravidade do planeta, mas o planeta não é afetado pela gravidade do gato. Em outras palavras, o corpo central é fixo.
Isso é um pouco semelhante ao Code Golf: Qual é o destino da nave espacial? [versão de ponto flutuante] , mas isso é diferente porque está medindo a precisão.
Você pode implementar uma solução com base em uma simulação, que deve ser executada em menos de 3 segundos, OU você pode implementar um programa que fornece um valor exato (também deve ser executado em menos de 3 segundos). Veja os detalhes da pontuação abaixo. Se você implementar uma simulação, ela não precisa ser exata, mas sua pontuação será mais baixa devido à imprecisão.
Entrada : x y z vx vy vz t
, não necessariamente inteiros representando x, y, z coordenadas, velocidade em x, y, z e indicações e tempo, respectivamente. É garantido que a velocidade do gato é estritamente menor que a velocidade de escape nessa altitude. A entrada pode ser obtida de qualquer lugar, incluindo parâmetros para uma função. O programa deve ser executado em menos de três segundos no meu laptop t < 2^30
, o que significa que, se você estiver executando uma simulação, deverá ajustar o timestep de acordo. Se você planeja atingir o limite de 3 segundos para cada caso de teste, verifique se existe um parâmetro ajustável que possa torná-lo mais preciso / menos preciso para ganhos de velocidade, para que eu possa executá-lo em três segundos no meu computador.
Saída : x y z
, a posição após o tempo t
.
Como o problema de dois corpos pode ser resolvido perfeitamente, é possível, em teoria, obter uma resposta perfeita e correta.
Pontuação : para qualquer caso de teste, o erro é definido como a distância entre a saída e a saída "true". A saída verdadeira é definida como aquela que o trecho de caso de teste gera. Se o erro for menor que 10^(-8)
, o erro será arredondado para zero. Sua pontuação é o erro médio em 100 (ou mais) casos de teste aleatórios. Se você escrever uma resposta perfeitamente precisa, receberá uma pontuação 0; a pontuação mais baixa vence e os empates serão interrompidos pelo tamanho do código.
Casos de teste :
1 0 0 0 -1 0 1000000000 --> 0.83789 -0.54584 0
Nesse caso, a órbita é perfeitamente circular com o período 2 * pi; portanto, depois de circular 159154943 vezes, o gato termina em aproximadamente (0,83789, -0,54584). Este não é um caso de teste em que seu código será testado; se você enviar uma resposta perfeitamente precisa, no entanto, convém testá-la.
O trecho abaixo gera casos de teste adicionais aleatórios e será usado para julgar envios; deixe-me saber se há um erro com isso:
fonte
t
dado em segundos? Nesse caso, a velocidade seria dada em unidades por segundo ou algo menor?t
é dado em tempo unitário, seja o que for, e a velocidade usará a mesma unidade. Seja em segundos ou horas, a resposta será a mesma.nearly massless cat
Bem, qual seria a massa exata do gato? Devemos apenas usar0
como um valor para a massa deste gato?Respostas:
Python 3.5 + NumPy, exato, 186 bytes
Esta é uma solução exata, usando uma fórmula que eu desenvolvi com base em Jesper Göranssonhis, “Simetrias do problema de Kepler”, 2015 . Ele usa uma pesquisa binária para resolver a equação transcendental Ax + B cos x + C sin x = D, que não possui solução de forma fechada.
A função espera que a posição e a velocidade sejam passadas como matrizes NumPy:
fonte
@
faz?numpy.dot
(multiplicação de produtos por ponto / matriz). Veja PEP 465.Javascript
Isso é apenas para fazer a bola rolar, já que ninguém parece postar respostas. Aqui está uma maneira simples e muito ingênua que pode ser melhorada bastante:
Teste:
Ei, isso é muito bom. Ele possui um erro de aproximadamente 3.333 * 10 ^ (- 6), que não é suficiente para ser arredondado para baixo ... está próximo.
Apenas por diversão:
Ah bem; então não é o melhor.
E em um caso de teste aleatório do gerador:
Com um erro de apenas aproximadamente 0,32305!
Isso pode ser melhorado muito usando algo como a integração Verlet ou algum algoritmo sofisticado. De fato, esses algoritmos podem até obter pontuações perfeitas, apesar de serem simulações.
fonte