Un chat presque sans masse est tombé dans l'espace (ne vous inquiétez pas, avec une combinaison spatiale et tout) au point (x, y, z)
avec la vitesse (vx, vy, vz)
. Il y a une planète fixe, infiniment dense (avec un volume de 0) au point (0, 0, 0)
et elle attire des objets à distance r
avec accélération 1/r^2
. Selon la gravité newtonienne, où va l'objet après le temps t
?
Presque sans masse dans ce cas signifie que vous produisez la valeur de lim (mass --> 0) <position of cat>
. La masse est affectée par la gravité de la planète, mais la planète n'est pas affectée par la gravité du chat. En d'autres termes, le corps central est fixe.
C'est quelque peu similaire à Code Golf: quel est le sort du vaisseau spatial? [version à virgule flottante] , mais c'est différent car il s'agit de mesurer la précision.
Vous pouvez implémenter une solution basée sur une simulation, qui doit s'exécuter en moins de 3 secondes, OU vous pouvez implémenter un programme qui donne une valeur exacte (doit également s'exécuter en moins de 3 secondes). Voir les détails de notation ci-dessous. Si vous implémentez une simulation, il n'est pas nécessaire qu'elle soit exacte, mais votre score sera inférieur en raison de l'inexactitude.
Entrée : x y z vx vy vz t
pas nécessairement des nombres entiers représentant x, y, z les coordonnées, la vitesse en x, y, et z et de temps respectivement. Il est garanti que la vitesse du chat est strictement inférieure à la vitesse d'échappement à cette altitude. L'entrée peut être prise de n'importe où, y compris les paramètres d'une fonction. Le programme doit s'exécuter en moins de trois secondes sur mon ordinateur portable t < 2^30
, ce qui signifie que si vous exécutez une simulation, vous devez ajuster votre pas de temps en conséquence. Si vous prévoyez d'atteindre la limite de 3 secondes pour chaque test, assurez-vous qu'il existe un paramètre réglable qui peut le rendre plus précis / moins précis pour les gains de vitesse, afin que je puisse le faire fonctionner en trois secondes sur mon ordinateur.
Sortie : x y z
la position après le temps t
.
Étant donné que le problème des deux corps peut être résolu parfaitement, il est en théorie possible d'obtenir une réponse parfaite et correcte.
Scoring : Pour tout cas de test, l'erreur est définie comme étant la distance entre votre sortie et la "vraie" sortie. La véritable sortie est définie comme étant celle générée par l'extrait de scénario de test. Si l'erreur est inférieure à 10^(-8)
, l'erreur est arrondie à zéro. Votre score est l'erreur moyenne sur 100 (ou plus) cas de test aléatoires. Si vous écrivez une réponse parfaitement précise, vous devriez obtenir un score de 0; le score le plus bas l'emporte et les égalités seront rompues par la longueur du code.
Cas de test :
1 0 0 0 -1 0 1000000000 --> 0.83789 -0.54584 0
Dans ce cas, l'orbite est parfaitement circulaire avec une période 2 * pi, donc après avoir encerclé 159154943 fois, le chat se retrouve à environ (0,83789, -0,54584). Ce n'est pas un cas de test sur lequel votre code sera testé; cependant, si vous soumettez une réponse parfaitement exacte, vous pouvez la tester.
L'extrait ci-dessous génère des cas de test supplémentaires aléatoires et sera utilisé pour juger les soumissions; faites-moi savoir s'il y a un bug avec ceci:
la source
t
donné en secondes? Si oui, la vitesse serait-elle donnée en unités par seconde, ou quelque chose de plus petit?t
est donnée en unité de temps, quelle qu'elle soit, et la vitesse utilisera la même unité. Que ce soit en secondes ou en heures, la réponse sera la même.nearly massless cat
Eh bien, quelle serait la masse exacte du chat? Faut-il simplement utiliser0
comme valeur la masse de ce chat?Réponses:
Python 3.5 + NumPy, exact, 186 octets
Il s'agit d'une solution exacte, utilisant une formule que j'ai conçue sur la base de Jesper Göranssonhis, «Symmetries of the Kepler problem», 2015 . Il utilise une recherche binaire pour résoudre l'équation transcendantale Ax + B cos x + C sin x = D, qui n'a pas de solution de forme fermée.
La fonction s'attend à ce que la position et la vitesse soient transmises sous forme de tableaux NumPy:
la source
@
il?numpy.dot
(multiplication produit / matrice). Voir PEP 465.Javascript
C'est juste pour lancer la balle, car personne ne semble poster de réponses. Voici un moyen très naïf et simple qui peut être beaucoup amélioré:
Essai:
Hé, c'est plutôt bien. Il a une erreur d'environ 3,333 * 10 ^ (- 6) ce qui n'est pas suffisant pour qu'il soit arrondi ... c'est proche.
Juste pour le fun:
Tant pis; ce n'est donc pas le meilleur.
Et sur un cas de test aléatoire du générateur:
Avec une erreur d'environ 0,32305 seulement!
Cela peut être beaucoup amélioré en utilisant quelque chose comme l'intégration de Verlet ou un algorithme sophistiqué. En fait, ces algorithmes peuvent même obtenir des scores parfaits, bien qu'ils soient des simulations.
la source