Seekor kucing yang hampir tanpa massa dijatuhkan di ruang angkasa (jangan khawatir, dengan baju ruang angkasa dan segalanya) pada titik (x, y, z)
dengan kecepatan (vx, vy, vz)
. Ada planet yang tetap, padat tak terhingga (dengan volume 0) di titik (0, 0, 0)
dan menarik objek di kejauhan r
dengan percepatan 1/r^2
. Menurut gravitasi Newton, ke mana objek pergi setelah waktu t
?
Hampir tanpa massa dalam hal ini berarti Anda mengeluarkan nilai lim (mass --> 0) <position of cat>
. Massa dipengaruhi oleh gravitasi planet, tetapi planet ini tidak terpengaruh oleh gravitasi kucing. Dengan kata lain, tubuh pusat tetap.
Ini agak mirip dengan Code Golf: Apa nasib pesawat ruang angkasa itu? [versi floating point] , tapi ini berbeda karena mengukur akurasi.
Anda dapat mengimplementasikan solusi berdasarkan simulasi, yang harus berjalan dalam waktu kurang dari 3 detik, ATAU Anda dapat mengimplementasikan program yang memberikan nilai tepat (juga harus berjalan dalam waktu kurang dari 3 detik). Lihat detail penilaian di bawah ini. Jika Anda menerapkan simulasi, itu tidak harus tepat, tetapi skor Anda akan lebih rendah karena ketidaktepatan tersebut.
Masukan : x y z vx vy vz t
, belum tentu bilangan bulat yang mewakili x, y, z koordinat, kecepatan dalam x, y, dan arah z dan waktu masing-masing. Dijamin bahwa kecepatan kucing benar-benar kurang dari kecepatan lepas di ketinggian itu. Input dapat diambil dari mana saja, termasuk parameter ke suatu fungsi. Program harus berjalan dalam waktu kurang dari tiga detik pada laptop saya untuk t < 2^30
, yang berarti, jika Anda menjalankan simulasi, Anda harus menyesuaikan catatan waktu Anda sesuai. Jika Anda berencana untuk mencapai batas 3 detik untuk setiap test case, pastikan ada parameter yang dapat diubah yang dapat membuatnya lebih akurat / kurang akurat untuk peningkatan kecepatan, sehingga saya dapat membuatnya berjalan dalam tiga detik di komputer saya.
Output : x y z
, posisi setelah waktu t
.
Karena masalah dua tubuh dapat diselesaikan dengan sempurna, secara teori dimungkinkan untuk mendapatkan jawaban yang sempurna dan benar.
Penilaian : Untuk kasus uji apa pun, kesalahan didefinisikan sebagai jarak antara output Anda dan output "true". Output sebenarnya didefinisikan sebagai output yang dihasilkan oleh snipet kasus uji. Jika kesalahan kurang dari 10^(-8)
, kesalahan dibulatkan ke nol. Skor Anda adalah kesalahan rata-rata pada 100 (atau lebih) kasus uji acak. Jika Anda menulis jawaban yang sangat akurat, Anda harus mendapatkan skor 0; kemenangan skor terendah, dan ikatan akan diputus berdasarkan panjang kode.
Kasus uji :
1 0 0 0 -1 0 1000000000 --> 0.83789 -0.54584 0
Dalam kasus ini, orbitnya melingkar sempurna dengan periode 2 * pi, jadi setelah berputar 159154943 kali, kucing berakhir pada sekitar (0,83789, -0,54584). Ini bukan ujian, kode Anda akan diuji; Namun, jika Anda mengirimkan jawaban yang sangat akurat, Anda mungkin ingin mengujinya.
Cuplikan di bawah ini menghasilkan kasus uji tambahan acak dan akan digunakan untuk menilai pengiriman; beri tahu saya jika ada bug dengan ini:
sumber
t
diberikan dalam detik? Jika demikian, apakah kecepatan akan diberikan dalam satuan per detik, atau sesuatu yang lebih kecil?t
diberikan dalam satuan waktu, apa pun itu, dan kecepatan akan menggunakan satuan yang sama. Apakah dalam hitungan detik atau jam, jawabannya akan sama.nearly massless cat
Nah, seperti apa massa kucing itu? Haruskah kita menggunakan0
nilai untuk massa kucing ini?Jawaban:
Python 3.5 + NumPy, tepat, 186 byte
Ini adalah solusi yang tepat, menggunakan formula I yang direkayasa berdasarkan Jesper Göranssonhis, "Symmetries of the Kepler problem", 2015 . Ia menggunakan pencarian biner untuk menyelesaikan persamaan transendental Ax + B cos x + C sin x = D, yang tidak memiliki solusi bentuk-tertutup.
Fungsi mengharapkan posisi dan kecepatan untuk dilewatkan sebagai array NumPy:
sumber
@
dilakukan?numpy.dot
(multiplikasi produk / matriks). Lihat PEP 465.Javascript
Ini hanya untuk membuat bola bergulir, karena sepertinya tidak ada yang memposting jawaban. Ini adalah cara yang sangat naif dan sederhana yang dapat ditingkatkan banyak:
Pengujian:
Hei, itu cukup bagus. Ini memiliki kesalahan sekitar 3,333 * 10 ^ (- 6) yang tidak cukup untuk dibulatkan ... sudah dekat.
Hanya untuk bersenang-senang:
Baiklah; jadi itu bukan yang terbaik.
Dan pada test case acak dari generator:
Dengan kesalahan hanya sekitar 0,32305!
Ini dapat ditingkatkan banyak dengan menggunakan sesuatu seperti integrasi Verlet atau beberapa algoritma mewah. Bahkan, algoritma tersebut bahkan bisa mendapatkan skor sempurna, meskipun simulasi.
sumber