pengantar
tl; dr
Terus menampilkan jarak saat ini dari Bumi ke Matahari.
Sederhana, orbit Bumi di sekitar Matahari adalah elips. Jadi jarak yang sebenarnya antara keduanya terus berubah. Jarak ini dapat dihitung untuk hari tertentu menggunakan rumus ini :
Persamaan dapat dibagi menjadi bagian-bagian 2 berikut :
1
mewakili 1 AU (unit astronomi), sama dengan149,597,870.691 km
0.01672
adalah eksentrisitas orbit antara Bumi dan Mataharicos
tentu saja fungsi cosinus, tetapi dengan argumen dalam derajat daripada radian0.9856
adalah 360 ° / 365,256363 hari , rotasi penuh dalam satu tahun, di mana365.256363
panjang tahun sidereal, dalam rata-rata hari matahariday
adalah hari dalam setahun[1-365]
4
mewakili offset ke perihelion , yaitu antara 4 dan 6 Januari
Formula ini membutuhkan satu hari penuh tetapi untuk tujuan tantangan ini - hasil yang terus menerus - Anda harus lebih akurat; atau tidak banyak yang akan terjadi sampai hari berikutnya. Cukup tambahkan persentase dari waktu lampau ke hari saat ini, seperti 1 :
day + (h * 3600 + m * 60 + s) / 864 / 100
Beberapa Contoh:
- 1 Januari, 23:59:59
1.99998842592593
- 1 Januari, 18:00:00
1.75
- 1 Januari, 12:00:00
1.50
- 1 Januari, 06:00:00
1.25
Memasukkan
Tantangan ini tidak memiliki input.
Jika bahasa Anda tidak bisa mendapatkan waktu saat ini, Anda bisa mendapatkannya sebagai masukan untuk program Anda. Input yang valid adalah cap waktu atau string tanggal-waktu lengkap yang paling sesuai dengan bahasa. Melewati hari ini saja (seperti 5
untuk 5 Januari atau 5.25
untuk hari yang sama pukul 6) tidak diperbolehkan.
Keluaran
Keluarkan jarak saat ini dari Bumi ke Matahari:
- Keluarkan nilai dalam
km
. - Perbarui nilainya setidaknya setiap detik .
Contoh output:
152098342
Jika tidak meningkatkan jumlah byte Anda, Anda juga dapat mencetak hasilnya:
152,098,342
152,098,342 km
Persyaratan
- Anda dapat menulis suatu program atau fungsi. Jika ini adalah fungsi anonim, harap sertakan contoh cara memintanya.
- Ini adalah kode-golf sehingga jawaban terpendek dalam byte menang.
- Celah standar tidak diijinkan.
Contoh implementasi
Saya sudah menyiapkan contoh implementasi dalam JavaScript. Ini tidak kompetitif atau golf.
// dayOfYear from http://stackoverflow.com/a/8620357/1456376
Date.prototype.dayOfYear = function() {
var j1= new Date(this);
j1.setMonth(0, 0);
return Math.round((this-j1)/8.64e7);
}
// vars
var e = document.getElementById('view'),
au = 149597870.691,
deg2rad = Math.PI/180,
date = now = value = null;
// actual logic
function calculate() {
date = new Date();
now = date.dayOfYear() + (date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds()) / 864 / 100;
value = 1 - 0.01672 * Math.cos(deg2rad * 0.9856 * (now - 4));
// supported in Firefox and Chrome, unfortunately not in Safari
e.innerHTML = Math.round(value * au).toLocaleString('en-US') + ' km';
setTimeout(calculate, 1000);
}
// let's do this
calculate();
<div id="view"></div>
1 Untuk tidak menambah kerumitan tanpa alasan, Anda tidak perlu mengubah waktu lokal Anda ke UTC. Jika Anda menggunakan UTC, harap tambahkan catatan untuk jawaban Anda.
2 Untuk lebih jelasnya lihat " Jarak Bumi-Matahari pada hari tertentu dalam setahun " di Fisika
Math.cos
menggunakan radian. Dan karena rumus ini tampaknya sangat perkiraan, Anda harus jelas tentang bagaimana jawaban harus diverifikasi.Jawaban:
TI-BASIC, 38 byte
Untuk kalkulator TI-84 + series. Beri nama ini
prgmA
. Perhatikan bahwa ini meluap tumpukan setelah beberapa ribu iterasi; gunakanWhile 1:...:End
sebaliknya jika ini merupakan masalah, untuk dua byte tambahan.Ini menggunakan perihelion pada 1 Januari 1997, 23:16 UTC untuk referensi, dan akurat dalam beberapa lusin kilometer (sekitar 7 digit akurasi) untuk beberapa tahun ke depan.
sumber
Java -
185180 byteIni menggunakan fakta bahwa ada 86.400 detik dalam sehari dan menggunakan waktu setempat, bukan GMT. Output terjadi jauh lebih dari sekali per detik. Tidak yakin apakah pernyataan impor harus dimasukkan dalam jumlah byte.
Untuk memasukkan penundaan 1 detik, tambahkan sekitar 26 byte misalnya
Java jelas bukan bahasa yang paling golf. :)
Dihapus beberapa byte berkat @insertusernamehere
sumber
1.0
menjadi1
? Dan bisakah Anda menghapus yang memimpin0
dari0.01672
dan0.9856
?import static
tetapi itu mungkin "curang" ... Saya masih agak baru di sini.System.err
sehingga tidak akan ada buffering. Saya tahuprintln
seharusnya mencetak segera, tapi sepertinya tidak selalu begitu. Tentu saja itu dapat dikonversi ke System.out tanpa mengubah jumlah byte :)Python, 101 byte
345600 = 4 * 24 * 3600 (empat hari)
5022635.53 ≌ (365.256363 * 24 * 3600) / (2π) (detik dalam tahun / 2π)
sumber
import
s:import time,math
. Juga, jika Anda menggunakan Python 2, Anda dapat menghapus kurung dariprint
.Bash / coreutils / bc, 101 byte
Ini menghitung offset dari 4 Januari dalam hitungan detik, jadi gunakan konstanta yang sesuai untuk mengkonversi ke radian. Setengah tahun dikonversi menjadi kira-kira pi:
Sisa perhitungannya langsung dari pertanyaan.
sumber
bc
mungkin bermanfaat untuk ini. Saya perhatikan bahwa Anda adadc
di header Anda, tetapi gunakanbc
dalam kode. Saya sering membingungkan keduanya sendiri.F #, 178 byte
Ini adalah skrip F # yang berjalan dengan baik di F # Interactive. Demi kesederhanaan, persyaratan "output terus menerus" dibawa ke tingkat literal, meskipun saya kehilangan satu byte untuk membuat output cetak pada baris baru setiap iterasi sehingga tidak terlalu buruk. = P
Tidak digabungkan dan dijelaskan:
sumber
Mathematica, 97 byte
Penjelasan
{DateValue@"Year",1,5}
mewakili 5 Januari tahun ini, dan...~DateDifference~...
memberikan jarak temporal.Dynamic[...,UpdateInterval->1]
perbarui ekspresi satu kali per detik.sumber
Dynamic[Round[PlanetData["Earth", "DistanceFromSun"]~QuantityMagnitude~"Kilometers"]]
Pyth, 51 byte
Formula alternatif
d / AU = 1 - 0,01672 cos (2π [waktu sejak perihelion] / [periode orbital])
Rumus ini pada dasarnya sama dengan rumus OP, kecuali itu digeneralisasikan untuk dapat menggunakan perihelion sebagai tanggal referensi.
Formula OP memiliki [waktu sejak perihelion] sebagai (hari - 4) dan memiliki (2π rad / [periode orbital]) yang telah dihitung sebelumnya sebagai 0,9856deg / hari.
Dalam solusi saya Saya menggunakan perihelion paling dekat dengan zaman Unix, 2 nd Januari 1970.
Kode
Dikompilasi dengan tangan ke pseudocode pythonic:
Ini pada dasarnya hanya mengubah rumus berikut menjadi kode:
d = (1 - 0,01672 cos (2π (t - 86400) / 31558149)) * 149597870.691 di
mana t adalah waktu Unix.
sumber
Python 2.4 - 158 byte
Mengambil waktu setempat dan meludahkan jarak. time.localtime () mengembalikan tuple dan dapat dirujuk di sini .
sumber
.0
dari864.0
dan100.0
untuk menyimpan beberapa byte?.0
agar mereka menjadi floating point dan bukan integer.C, 338
sumber