Un gato casi sin masa se deja caer en el espacio (no te preocupes, con un traje espacial y todo) en el punto (x, y, z)
con velocidad (vx, vy, vz)
. Hay un planeta fijo, infinitamente denso (con un volumen de 0) en el punto (0, 0, 0)
y atrae objetos a distancia r
con aceleración 1/r^2
. Según la gravedad newtoniana, ¿a dónde va el objeto después del tiempo t
?
Casi sin masa en este caso significa que está emitiendo el valor de lim (mass --> 0) <position of cat>
. La masa se ve afectada por la gravedad del planeta, pero el planeta no se ve afectado por la gravedad del gato. En otras palabras, el cuerpo central está fijo.
Esto es algo similar a Code Golf: ¿Cuál es el destino de la nave espacial? [versión de punto flotante] , pero esto es diferente porque mide la precisión.
Puede implementar una solución basada en una simulación, que debe ejecutarse en menos de 3 segundos, O puede implementar un programa que proporcione un valor exacto (también debe ejecutarse en menos de 3 segundos). Ver detalles de puntuación a continuación. Si implementa una simulación, no tiene que ser exacta, pero su puntaje será menor debido a la inexactitud.
Entrada : x y z vx vy vz t
no necesariamente números enteros que representan las coordenadas x, y, z, la velocidad en las direcciones x, y y z y el tiempo, respectivamente. Se garantiza que la velocidad del gato es estrictamente menor que la velocidad de escape a esa altitud. La entrada puede tomarse desde cualquier lugar, incluidos los parámetros de una función. El programa debe ejecutarse en menos de tres segundos en mi computadora portátil t < 2^30
, lo que significa que, si está ejecutando una simulación, debe ajustar su paso de tiempo en consecuencia. Si está planeando alcanzar el límite de 3 segundos para cada caso de prueba, asegúrese de que haya un parámetro sintonizable que pueda hacerlo más preciso / menos preciso para las ganancias de velocidad, de modo que pueda hacerlo funcionar en tres segundos en mi computadora.
Salida :, x y z
la posición después del tiempo t
.
Dado que el problema de dos cuerpos se puede resolver perfectamente, en teoría es posible obtener una respuesta correcta y perfecta.
Puntuación : Para cualquier caso de prueba, el error se define como la distancia entre su salida y la salida "verdadera". La salida verdadera se define como la que genera el fragmento de caso de prueba. Si el error es menor que 10^(-8)
, el error se redondea a cero. Su puntaje es el error promedio en 100 (o más) casos de prueba aleatorios. Si escribe una respuesta perfectamente precisa, debería obtener una puntuación de 0; gana la puntuación más baja, y los lazos se romperán por la longitud del código.
Casos de prueba :
1 0 0 0 -1 0 1000000000 --> 0.83789 -0.54584 0
En este caso, la órbita es perfectamente circular con el período 2 * pi, por lo que después de dar vueltas 159154943 veces, el gato termina en aproximadamente (0.83789, -0.54584). Este no es un caso de prueba en el que se probará su código; Sin embargo, si envía una respuesta perfectamente precisa, es posible que desee probarla.
El fragmento a continuación genera casos de prueba adicionales aleatorios y se utilizará para juzgar los envíos; avíseme si hay un error con esto:
fuente
t
da el tiempo en segundos? Si es así, ¿se daría la velocidad en unidades por segundo, o algo más pequeño?t
se da en unidad de tiempo, sea lo que sea, y la velocidad usará la misma unidad. Ya sea en segundos u horas, la respuesta será la misma.nearly massless cat
Bueno, ¿cuál sería la masa exacta del gato? ¿Deberíamos usar0
como valor para la masa de este gato?Respuestas:
Python 3.5 + NumPy, exacto, 186 bytes
Esta es una solución exacta, utilizando una fórmula que diseñé basada en Jesper Göranssonhis, "Symmetries of the Kepler problem", 2015 . Utiliza una búsqueda binaria para resolver la ecuación trascendental Ax + B cos x + C sen x = D, que no tiene una solución de forma cerrada.
La función espera que la posición y la velocidad se pasen como matrices NumPy:
fuente
@
?numpy.dot
(multiplicación de matriz / producto de puntos). Ver PEP 465.Javascript
Esto es solo para que la pelota ruede, ya que nadie parece estar publicando respuestas. Aquí hay una manera muy ingenua y simple que se puede mejorar mucho:
Pruebas:
Oye, eso está bastante bien. Tiene un error de aproximadamente 3.333 * 10 ^ (- 6) que no es suficiente para que se redondee hacia abajo ... está cerca.
Solo por diversión:
Oh bien; entonces no es el mejor.
Y en un caso de prueba aleatorio del generador:
¡Con un error de solo aproximadamente 0.32305!
Esto se puede mejorar mucho usando algo como la integración de Verlet o algún algoritmo sofisticado. De hecho, esos algoritmos pueden incluso obtener puntajes perfectos, a pesar de ser simulaciones.
fuente