pengantar
Hari ini saya pergi memancing sendirian dengan sampan, sayangnya saya tertidur dan arus membawa saya pergi, saya kehilangan dayung, sekarang malam dan saya tersesat di lautan! Saya tidak bisa melihat pantai jadi saya harus jauh!
Saya memiliki ponsel tetapi tidak berfungsi karena basah oleh air asin, saya tidak dapat berbicara atau mendengar apa pun karena mikrofon dan speaker ponsel rusak, tetapi saya dapat mengirim SMS ke teman saya yang berada di pantai pantai!
Teman saya memiliki obor yang sangat kuat dan dia mengangkatnya di atas tongkat bambu untuk menunjukkan kepada saya arah yang benar, tetapi saya tidak dapat mendayung karena saya tidak memiliki dayung, jadi saya harus mengatakan kepadanya seberapa jauh saya sehingga dia dapat mengirim seseorang ke tangkap aku!
Teman saya mengatakan kepada saya bahwa ia menjaga obor di ketinggian 11,50 meter di atas permukaan laut, dan saya bisa melihat cahaya tepat di cakrawala. Sekarang saya hanya ingat dari sekolah bahwa jari-jari Bumi seharusnya 6371 Km di permukaan laut, dan saya duduk di sampan saya sehingga Anda dapat berasumsi bahwa mata saya juga berada di permukaan laut.
Tugas
Karena arus menggerakkan saya dari waktu ke waktu, teman saya menaikkan obor dari waktu ke waktu (sekarang di ketinggian 12,30 meter), tolong tuliskan program atau fungsi lengkap yang akan membantu saya menghitung jarak dari posisi teman saya!
Berikut adalah diagram (bukan untuk skala):
Titik oranye berlabel M
adalah saya, titik merah berlabel T
adalah obor. Garis hijau adalah jarak linear antara M
danT
Memasukkan
Ambil dari input standar ketinggian obor h
dalam meter di permukaan laut, yang saya lihat tepat di atas cakrawala, dalam bentuk angka titik apung dengan presisi dua desimal (dengan akurasi 1 sentimeter atau 0,01 meter), di mulai dari 0 hingga 100.
Keluaran
Anda harus mengembalikan panjang garis hijau euclidean dengan akurasi 1 cm. Misalnya jika Anda menghasilkan dalam meter, harus dengan dua desimal (setidaknya). Outputnya bisa berupa meter atau kilometer, tetapi menghormati keakuratannya.
Kasus uji:
Semua nilai dalam meter.
11.5 > 12105.08
13.8 > 13260.45
Aturan
Kode terpendek menang.
sumber
Jawaban:
05AB1E ,
131210 byteDisimpan 2 byte berkat Emigna.
Karena tidak ada fungsi trigonometri yang dapat disebut dengan menggunakan asumsi OP bahwa bumi secara lokal adalah sebuah pesawat, menjadi mungkin untuk membuat solusi 05AB1E.
Cobalah online!
sumber
12742000
dapat ditulis sebagai•1#oC•
•1#oC•+*t
dalam 2sable•
menggambarkan ... nomor base 214? 05AB1E terkadang kekurangan dokumentasi tentang fungsi khusus tersebut. Jawaban 2sable bagus juga. Saya mengetahuinya beberapa hari yang lalu tetapi saya tidak berpikir untuk menggunakannya untuk pertanyaan ini.Python,
3426 byte:( -8 byte terima kasih kepada Osable! )
Fungsi lambda anonim. Mengambil input dalam kilometer dan menghasilkan dalam kilometer. Diminta sebagai
print(<Function Name>(<Input>))
.sumber
lambda i:(i*(i+12742))**.5
akan lebih pendek.i
dan 12742, ungkapan dapat disingkat jadi:(i*12742)**.5
PHP, 34 byte
kerusakan
sejauh ini, ini identik dengan jawaban Mathematica lama
sekarang yang tersisa untuk dilakukan adalah menambahkan input
=$argv[1]
dan output<?=
- selesaisumber
dc,
1611 byte:Meminta input melalui baris perintah dalam kilometer dan kemudian menampilkan jarak dalam kilometer.
Penjelasan
Ini memanfaatkan hal-hal berikut:
sumber
jq, 18 karakter
Namun salinan lain dari formula yang sama.
Contoh dijalankan:
Tes online
sumber
Haskell, 22 byte
Pemakaian:
Pointfree: (23 byte)
sumber
R, 29 byte
Mengambil input dari stdin
sumber
(h=scan())*(1+12742e3/h)^.5
.Mathematica, 16 byte
Salah satu dari ini bekerja untuk input dan output dalam kilometer:
Ini adalah aplikasi sederhana Pythagoras untuk masalah ini:
sumber
Jelly, 9 byte di halaman kode Jelly
Saya memutuskan untuk mulai menulis program dalam bahasa golf. Saya benar-benar menemukan algoritma yang lebih efisien daripada yang digunakan orang lain (setidaknya dalam jarak pendek seperti yang ada di pertanyaan), tetapi itu membutuhkan angka floating-point literal yang tampaknya tidak dapat dikompresi oleh Jelly, jadi Pythagoras ini.
Penjelasan:
Kebutuhan akan
µ
pemisah membuatku kesal, tapi kupikir itu tidak bisa dihindari; Jelly telah menyimpan byte lebih dari 05AB1E dengan bisa menebak argumen apa yang dibutuhkan banyak perintah, tetapi dalam kasus ini tidak dapat menebak dengan benar sampai akhir, jadi saya perlu memberikan petunjuk.Jelly, 7 byte di halaman kode Jelly
Seperti yang saya jelaskan di jawaban saya yang lain , aproksimasi deret terhadap aproksimasi Pythagoras benar-benar menghasilkan hasil yang lebih baik daripada panjang yang termasuk dalam pertanyaan (setidaknya, mereka lebih dekat dengan contoh output), dan juga memiliki formula yang lebih pendek. Ketika saya sedang menulisnya, saya menyadari bahwa alih-alih menghitung akar kuadrat dari 12742000 sebelumnya, saya bisa mengalikan angka dengan 12742000 terlebih dahulu, dan kemudian kuadrat akar keduanya pada saat yang sama. Ini pada dasarnya setara dengan formula lain tanpa tambahan, dan dengan demikian, dapat diproduksi dari program sebelumnya dengan menghapus tambahan dari itu. Ini menghemat dua byte, karena sekarang diurai secara ambigu dan jadi kita tidak perlu
µ
lagi.sumber
Ruby, 23
23 byte, dalam Km
25 byte, dalam m
sumber
Tcl, 49 byte:
Yah, saya baru mengenal Tcl, jadi setiap tips untuk bermain golf ini sangat dihargai. Seperti jawaban saya yang lain, meminta input baris perintah dalam kilometer dan output dalam kilometer. Pada dasarnya sebuah adaptasi Tcl dari jawaban
dc
danpython
jawaban saya.sumber
x86_64 + kode mesin SSE, 16 byte
Bytes program ada di sebelah kiri (dalam heksadesimal), ada pembongkaran di sebelah kanan untuk membuatnya sedikit lebih mudah dibaca. Ini adalah fungsi yang mengikuti konvensi x86_64 normal untuk fungsi yang mengambil dan mengembalikan angka floating point presisi tunggal (ia mengambil argumen dalam% xmm0 dan mengembalikan jawabannya dalam register yang sama, dan menggunakan% xmm1 dan% eax sebagai temporaries; ini adalah konvensi pemanggilan yang sama yang akan digunakan oleh program C, dan dengan demikian Anda dapat memanggil fungsi langsung dari program C, yang merupakan cara saya mengujinya).
Meskipun dengan pembongkaran, ini masih membutuhkan penjelasan. Pertama, ada baiknya membahas formula. Kebanyakan orang mengabaikan lengkungan bumi dan menggunakan rumus Pythagoras untuk mengukur jarak. Saya melakukannya juga, tetapi saya menggunakan perkiraan ekspansi seri; Saya hanya mengambil istilah yang berkaitan dengan kekuatan input pertama, dan mengabaikan kekuatan ketiga, kelima, ketujuh, dll., Yang semuanya hanya memiliki pengaruh yang sangat kecil pada jarak pendek ini. (Selain itu, perkiraan Pythagoras memberikan nilai yang rendah, sedangkan istilah selanjutnya dalam ekspansi seri berfungsi untuk mengurangi nilai; dengan demikian, dengan mengabaikan faktor kecil yang akan berfungsi untuk mendorong perkiraan di arah yang salah, saya benar-benar mendapatkan hasil yang lebih akurat dengan menggunakan rumus yang kurang akurat.) Rumusnya ternyata 712742000 × √h;
0x455f1980
.Hal berikutnya yang mungkin membingungkan orang adalah mengapa saya menggunakan instruksi vektor untuk akar kuadrat dan multiply;
%xmm0
dan%xmm1
dapat masing-masing memegang empat angka floating point presisi tunggal, dan saya beroperasi pada keempatnya. Alasannya di sini sangat sederhana: pengkodeannya satu byte lebih pendek dari pada instruksi skalar yang sesuai. Jadi saya bisa membuat FPU melakukan banyak pekerjaan ekstra rooting persegi dan mengalikan nol untuk menyelamatkan diri saya dua byte, dalam metode yang sangat mirip dengan algoritma bahasa golf yang khas. (Saya menyebut assembler x86 bahasa golf assembler dalam obrolan beberapa waktu yang lalu, dan saya masih belum berubah pikiran tentang hal itu.)Dari sana, algoritma ini sangat sederhana: memuat
%xmm1
dengan √12742000 via%eax
(yang lebih pendek dalam hal byte daripada memuatnya dari memori), akar kuadrat argumen (dan tiga nol), gandakan elemen yang sesuai dari%xmm1
dan%xmm0
(kami hanya peduli tentang elemen pertama), lalu kembali.sumber
Minkolang v0.15, 22 byte
Cobalah online!
sumber
JavaScript (ES6),
3125 byteMenampilkan nilai dalam meter
sumber