Eine beinahe masselose Katze fällt in den Weltraum (keine Sorge, mit einem Raumanzug und allem) und zwar an der Stelle der (x, y, z)
Geschwindigkeit (vx, vy, vz)
. Am Punkt befindet sich ein fester, unendlich dichter Planet (mit einem Volumen von 0), der entfernte (0, 0, 0)
Objekte anziehtr
mit einer Beschleunigung1/r^2
. Wohin geht das Objekt nach der Newtonschen Schwerkraft nach der Zeit t
?
Nahezu masselos bedeutet in diesem Fall, dass Sie den Wert von ausgeben lim (mass --> 0) <position of cat>
. Die Masse wird durch die Schwerkraft des Planeten beeinflusst, aber der Planet wird nicht durch die Schwerkraft der Katze beeinflusst. Mit anderen Worten ist der Zentralkörper fest.
Das ist etwas ähnlich zu Code Golf: Was ist das Schicksal des Raumschiffs? [Gleitkomma-Version] , aber das ist anders, weil es die Genauigkeit misst.
Sie können eine auf einer Simulation basierende Lösung implementieren, die in weniger als 3 Sekunden ausgeführt werden muss, ODER Sie können ein Programm implementieren, das einen genauen Wert angibt (muss auch in weniger als 3 Sekunden ausgeführt werden). Details zur Wertung finden Sie weiter unten. Wenn Sie eine Simulation implementieren, muss diese nicht exakt sein, aber Ihre Punktzahl wird aufgrund der Ungenauigkeit niedriger sein.
Eingabe : x y z vx vy vz t
Nicht unbedingt ganze Zahlen, die die x-, y-, z-Koordinaten, die Geschwindigkeit in x-, y- und z-Richtung bzw. die Zeit darstellen. Es ist garantiert, dass die Geschwindigkeit der Katze streng unter der Fluchtgeschwindigkeit in dieser Höhe liegt. Die Eingabe kann von überall erfolgen, einschließlich der Parameter für eine Funktion. Das Programm muss auf meinem Laptop in weniger als drei Sekunden ausgeführt werden. t < 2^30
Wenn Sie also eine Simulation ausführen, müssen Sie Ihren Zeitschritt entsprechend anpassen. Wenn Sie vorhaben, die 3-Sekunden-Grenze für jeden Testfall zu überschreiten, stellen Sie sicher, dass es einen einstellbaren Parameter gibt, der die Genauigkeit / Ungenauigkeit für Geschwindigkeitszuwächse erhöht, sodass ich ihn auf meinem Computer in drei Sekunden ausführen kann.
Ausgabe : x y z
Die Position nach der Zeit t
.
Da das Zweikörperproblem perfekt gelöst werden kann, ist es theoretisch möglich, eine perfekte, korrekte Antwort zu erhalten.
Bewertung : Für jeden Testfall ist der Fehler der Abstand zwischen Ihrer Ausgabe und der "wahren" Ausgabe. Die wahre Ausgabe ist definiert als die Ausgabe, die das Testfall-Snippet generiert. Wenn der Fehler kleiner als ist 10^(-8)
, wird der Fehler auf Null abgerundet. Ihre Punktzahl ist der durchschnittliche Fehler bei 100 (oder mehr) zufälligen Testfällen. Wenn Sie eine absolut genaue Antwort schreiben, sollten Sie eine Punktzahl von 0 erhalten. Die niedrigste Punktzahl gewinnt, und das Unentschieden wird durch die Codelänge unterbrochen.
Testfälle :
1 0 0 0 -1 0 1000000000 --> 0.83789 -0.54584 0
In diesem Fall ist die Umlaufbahn mit der Periode 2 * pi perfekt kreisförmig, sodass die Katze nach 159154943-maligem Kreisen bei ungefähr (0,83789, -0,54584) landet. Dies ist kein Testfall, an dem Ihr Code getestet wird. Wenn Sie jedoch eine absolut genaue Antwort einreichen, können Sie diese testen.
Das folgende Snippet generiert zufällige zusätzliche Testfälle und wird zur Beurteilung von Einsendungen verwendet. Lass es mich wissen, wenn es einen Fehler gibt:
quelle
t
in Sekunden angegeben? Wenn ja, würde die Geschwindigkeit in Einheiten pro Sekunde angegeben werden oder etwas kleineres?t
wird in Zeiteinheiten angegeben, und die Geschwindigkeit verwendet dieselbe Einheit. Ob in Sekunden oder Stunden, die Antwort ist dieselbe.nearly massless cat
Nun, was wäre die genaue Masse der Katze? Sollen wir nur0
als Wert für die Masse dieser Katze verwenden?Antworten:
Python 3.5 + NumPy, genau, 186 Bytes
Dies ist eine exakte Lösung, bei der eine Formel I verwendet wird, die auf Jesper Göranssonhis, „Symmetrien des Kepler-Problems“, 2015, basiert . Es wird eine binäre Suche verwendet, um die transzendentale Gleichung Ax + B cos x + C sin x = D zu lösen, für die es keine Lösung in geschlossener Form gibt.
Die Funktion erwartet, dass Position und Geschwindigkeit als NumPy-Arrays übergeben werden:
quelle
@
?numpy.dot
(Skalarprodukt / Matrix-Multiplikation). Siehe PEP 465.Javascript
Dies ist nur, um den Ball ins Rollen zu bringen, da niemand Antworten zu posten scheint. Hier ist ein sehr naiver, einfacher Weg, der viel verbessert werden kann:
Testen:
Hey, das ist ziemlich gut. Es hat einen Fehler von ca. 3.333 * 10 ^ (- 6), der nicht ausreicht, um abgerundet zu werden ... es ist knapp.
Nur zum Spaß:
Naja; es ist also nicht das beste.
Und an einem zufälligen Testfall vom Generator:
Mit einem Fehler von nur ca. 0,32305!
Dies kann durch Verlet-Integration oder einen ausgefallenen Algorithmus erheblich verbessert werden. Tatsächlich können diese Algorithmen sogar perfekte Ergebnisse erzielen, obwohl es sich um Simulationen handelt.
quelle