Sebuah gunung didefinisikan sebagai satu set segmen garis yang pertama titik memiliki koordinat (0,a)
di mana a > 0
, dan yang terakhir titik memiliki koordinat (b,0)
, di mana b > 0
. Semua titik antara memiliki koordinat y (ordinat) yang benar-benar lebih besar dari 0. Anda diberi titik di gunung yang diurutkan dalam urutan koordinat x (abscissa). Perhatikan bahwa dua titik dapat memiliki koordinat x yang sama, menghasilkan segmen vertikal gunung. Jika Anda diberi dua poin dengan koordinat x yang sama, mereka harus terhubung dalam urutan yang diberikan. Selain itu, mungkin ada segmen horisontal dari gunung. Segmen horizontal ini tidak menyala, apa pun yang terjadi. Semua koordinat adalah bilangan bulat tidak negatif.
Pertanyaannya: berapa panjang total gunung yang akan dinyalakan, dengan asumsi matahari adalah bidang cahaya vertikal tak terbatas yang terletak di sebelah kanan gunung? Angka ini tidak perlu dibulatkan, tetapi jika dibulatkan, sertakan setidaknya empat tempat desimal. Saya telah menyertakan gambar: Di sini, garis-garis yang dicetak tebal mewakili segmen yang menyala. Perhatikan bahwa dalam input, P muncul sebelum Q (PQ adalah segmen garis vertikal) sehingga titik sebelumnya terhubung ke P dan bukan Q.
Anda dapat mengambil input dalam format yang masuk akal, seperti daftar daftar, satu daftar, string, dll.
Kasus cobaan:
(0,3000)
(500, 3500)
(2500, 1000)
(5000,5000)
(9000,2000)
(9000,3500)
(10200,0)
Output: 6200.0000
Ada dua segmen yang menyala di sini, seperti yang ditunjukkan pada gambar ini: Yang pertama memiliki panjang 5000/2 = 2500 dan yang kedua memiliki panjang 3.700.
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
(x1, y1)
dan(x2,y2)
. Titik yang "memblokir" itu adalah(x3, y3)
. Asumsikan y2 <y3 <= y1. Kemudian panjang segmen adalah((y1 - y3)/(y1 - y2))*sqrt((x1 - x2)^2 + (y1 - y2)^2)
. Ini pada dasarnya adalah formula jarak, dikalikan dengan pecahan segmen yang sebenarnya digunakanJawaban:
Python 2 ,
134 131 128 124 120 117 109107 byteCobalah online!
Mengambil input sebagai daftar tupel / daftar elemen dua angka floating-point.
Penjelasan
Kami pada dasarnya beralih melalui pasangan titik dalam grafik, dan jika , maka kami menghitung berapa banyak garis yang terpapar cahaya. Iterasi berpasangan dilakukan dengan lingkaran untuk mendapatkan titik berikutnya, ( x 2 , y 2 ) , muncul elemen pertama dalam daftar setiap kali untuk mengambil titik saat ini, ( x 1 , y 1 ) .y1>y2 ( x2, y2) ( x1, y1)
for
Matematika - Bagian segmen garis apa yang terpapar cahaya?
Dengan bergabung dengan dua formula, kita sampai pada ungkapan berikut, yang merupakan inti dari pendekatan ini:
Kode - Bagaimana cara kerjanya?
Changelog
Formula yang dioptimalkan secara bertahap untuk tujuan bermain golf.
Disimpan 1 byte berkat FlipTack .
Menyelamatkan 2 byte dengan menghapus kondisi yang tidak perlu itu
y>Y
, karena jika maksimum lokal Y- koordinat setelah titik saat ini dikurangi dariy
positif, maka kondisi itu berlebihan. Sayangnya ini membatalkan golf FlipTack.Disimpan 3 byte dengan mengubah sedikit algoritme: alih-alih memiliki variabel penghitung, menambahkannya dan mengikuti daftar, kami menghapus elemen pertama di setiap iterasi.
Disimpan 8 byte berkat ovs ; mengubah
(x,y),(X,Y)
kondisi loop denganlist.pop()
teknik.Disimpan 2 byte berkat Ørjan Johansen (dioptimalkan sedikit rumus).
sumber
JavaScript, 97 byte
(5 byte dapat disimpan, jika mengambil versi input yang terbalik dianggap valid.)
sumber
APL + WIN, 48 byte
Anjuran untuk daftar koordinat x diikuti oleh daftar koordinat y
Penjelasan
Jarak vertikal yang menyala = h dan jarak horizontal yang menyala adalah (3) * (1) / (2). Sisanya adalah Pythagoras.
sumber
+/.5*⍨(h*2)+×⍨((h←-2-/⌈\m)÷-2-/m←⌽⎕)×⌽-2-/⎕
bekerja⍨
operator jadi saya tidak bisa mengatakanSwift , 190 byte
Cobalah online!
Penjelasan
sumber
Python 2 ,
122120 byteCobalah online!
sumber
[::-1]
.Python 2 , 89 byte
Cobalah online!
Mengambil daftar pasang pelampung. Didasarkan pada solusi ovs .
sumber
[::-1]
.APL (Dyalog Unicode) , 31 byte SBCS
Menggunakan formula Graham .
Fungsi awalan anonim mengambil 2 x n matriks data sebagai argumen yang benar. Baris pertama berisi nilai-x dari kanan ke kiri, dan baris kedua berisi nilai-y.
Cobalah online!
{
…}
Lambda anonim di mana⍵
argumennya:2-/⍵
delta (lit. minus-reduksi berpasangan)÷⌿
Δx ⁄ Δy (pengurangan divisi vertikal lit.)×⍨
square (lit. selfie perkalian)1+
satu ditambahkan ke itu(
...)×
gandakan yang berikut dengan itu:2⌷⍵
baris kedua argumen (nilai y)⌈\
menjalankan maksimum (ketinggian tertinggi bertemu sampai sekarang, dari kanan)2-/
delta (lit. berpasangan minus-reduksi)×⍨
square (lit. selfie perkalian).5*⍨
akar kuadrat (lit. naikkan ke kekuatan setengah)+/
jumlahsumber
Jelly , 23 byte
Tautan diad mengambil daftar nilai y di sebelah kiri dan daftar masing-masing nilai x di sebelah kanan (seperti yang secara eksplisit diizinkan oleh OP dalam komentar)
Cobalah online!
Bagaimana?
Fraksi dari bagian (miring) yang menyala adalah fraksi yang sama yang akan menyala jika itu adalah penurunan vertikal. Perhatikan bahwa karena kuadrat terjadi untuk mengevaluasi panjang lereng, ketinggian yang dihitung sepanjang jalan bisa negatif (juga di bawah panjang run dari lereng yang menyala dihitung sebagai negatif dibagi dengan negatif).
Versi monadik 25 byte yang mengambil daftar
[x,y]
koordinat:Coba yang ini.
sumber
⁸
dan⁹
s.Kotlin , 178 byte
Cobalah online!
Bagian pengujian sangat tidak golf :)
sumber